我正在使用AUTOFAC使用ASPNET Core。我有两个单身服务,它们充当缓存(从数据库中获取数据并缓存数据(。我需要创建一个新的范围,以便将DBContext声明为实例Perlifetime,在两个Singleton服务之间不会共享自己的dbcontext(如何在ASP.NET Core中获得ICONTAINER?我试图致电containerBuild.Build();
,并且得到了系统已经构建的容器的错误。
这不是终生范围的工作方式。
如果您将某些内容注册为单例(SingleInstance
(,它将从根生命范围而不是子范围内解决。它的依赖项也将从根范围(容器(而不是子范围中解决。
这是关于文档主题"圈养依赖"的公平详细介绍的。
基本上,您不能有一个单身人士,该单身人士需要每次要求或儿童终身范围依赖性。您可以拥有一个单身人士,该单元按实例依赖性(只能从容器而不是子范围内解决(,然后保留(;或者,您可以拥有一个单身人士,该单元需要一个每千年的范围组件,而使用的寿命范围将是根容器,从而有效地从您消耗的东西中创建一个单例。
但是,您真正问的问题是"我如何在ASP.NET Core中获取容器",并且在文档中,ASP.NET Core中的答案也是快速启动(无configurecontainer("部分。
- 切换
ConfigureServices
方法返回IServiceProvider
而不是void
- 自己构建容器,并将其引用您自己选择的地方。
- 在
ConfigureSerivces
末尾返回new AutofacServiceProvider(container)
。
文档中有一个完整的代码样本。
它不会帮助您解决更大的问题,但是至少您可以获取容器并进行您想要的实验。
我认为您不需要新的范围。据我所知,dbcontext
的最佳实践是dbcontext-per-business operation
。对于Web应用程序,这是Web请求。
在您的情况下,您可以将某些IDbContextFactory
(也可以单例(传递到这些单例中,并在需要时创建新的DbContext
实例。
您可以从构造函数解析ILifetimeScope
并调用其BeginLifetimeScope
方法。