使用autofac在asp.net核心项目上创建新范围

时间:2019-05-24 07:53:48

标签: c# .net asp.net-core .net-core autofac

我正在将aspnet core与autofac一起使用。我有两个充当缓存的单例服务(从数据库获取数据并将其缓存)。我需要创建一个新作用域,以使声明为InstancePerLifeTime的dbcontext不会在两个单例服务之间共享(每个服务必须具有其自己的dbcontext) 如何在asp.net核心中获取IContainer? 我尝试调用containerBuild.Build();,但收到错误消息,指出系统已经构建了容器。

3 个答案:

答案 0 :(得分:0)

我认为您不需要新的范围。据我所知,dbcontext的最佳实践是dbcontext-per-business operation。如果是Web应用程序,则是Web请求。

在您的情况下,您可以将一些IDbContextFactory(也包括单个)传递到这些单例中,并在需要时创建新的DbContext实例。

答案 1 :(得分:0)

您可以从构造函数中解析ILifetimeScope并调用其BeginLifetimeScope方法。

答案 2 :(得分:0)

这不是生存期作用域的工作方式。

如果您将某项注册为单例(SingleInstance),它将从根生存期作用域而非子作用域得到解析。它的依存关系_也将从根作用域(容器)而不是子作用域得到解决。

This is walked through in fair detail on the documentation topic 'Captive Dependencies'.

基本上,您不能让单例具有每个请求实例或子生存期范围的依赖关系。您可以使一个单例具有每个实例的实例性(只能从容器中解决一次,而不是从子范围中解决,然后再保留);或者,您也可以让一个单例使用“每寿命实例数实例”组件,并且所使用的生存期范围将成为根容器,从而有效地从您所消费的事物中创建一个单例。

但是,您真正要问的问题是“如何在ASP.NET Core中获得容器”以及对此的答案is also in the documentation, in the ASP.NET Core "Quick Start (Without ConfigureContainer)" section.

  • 切换ConfigureServices方法以返回IServiceProvider而不是void
  • 自己构建容器,并在自己选择的位置保留对它的引用。
  • new AutofacServiceProvider(container)的末尾返回ConfigureSerivces

文档中有完整的代码示例。

它不会帮助您解决更大的问题,但至少您可以获取容器并进行所需的实验。