我正在将aspnet core与autofac一起使用。我有两个充当缓存的单例服务(从数据库获取数据并将其缓存)。我需要创建一个新作用域,以使声明为InstancePerLifeTime的dbcontext不会在两个单例服务之间共享(每个服务必须具有其自己的dbcontext)
如何在asp.net核心中获取IContainer?
我尝试调用containerBuild.Build();
,但收到错误消息,指出系统已经构建了容器。
答案 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
。文档中有完整的代码示例。
它不会帮助您解决更大的问题,但至少您可以获取容器并进行所需的实验。