使用AUTOFAC在ASP.NET核心项目上创建新的范围



我正在使用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方法。

最新更新