Entity Framework 带有单例依赖注入的核心

Entity Framework Core with dependency injection with singletons

我正在尝试对单例使用依赖注入 DBContext.

在 .net 框架中我可以做这样的事情

public class MySingleton
{
    private readonly Func<MyDbContext> _getContext;
    public MySingleton(Func<MyDbContext> getContext)
    {
      _getContext = getContext;
    }
}

但是,当我现在这样做时,出现以下错误:

Unable to resolve service for type 'System.Func`1[MyDbContext]'

我确实尝试将其添加到构造函数中。

public class MySingleton
{
    private readonly Func<MyDbContext> _getContext;
    public MySingleton(IServiceProvider serviceProvider)
    {
         _getContext =
             () => (MyDbContext)serviceProvider.GetService(typeof(MyDbContext));
    }
}

但是,serviceProvider returns同一个实例

如何在每次使用时创建一个新的 MyDbContext 实例?

当用 MS.DI 解析单例时,该单例 及其所有依赖项 从根 scope/container 解析。这就是为什么您会遇到从注入的 IServiceProvider 解析 MyDbContext 总是给出相同实例的行为;该作用域实例是 scoped 到容器。换句话说,那个作用域实例隐式地变成了一个单例。

MS.DI 的 Closure Composition Model makes it very hard to resolve scopes within singletons (without manually managing scopes through ambient state), because scopes are not available ubiquitously through ambient state, as is done using the Ambient Composition Model.

实际上,这里有两个选项:

  1. 将单例组件的生命周期缩短为 TransientScoped
  2. 您从组件的方法中启动和管理 IServiceScope 并从该范围解析范围组件。例如:
    public class MySingleton
    {
        private readonly IServiceProvider provider;
        public MySingleton(IServiceProvider provider)
        {
            this.provider = provider;
        }
    
        public void SomeMethod()
        {
            using (var scope = this.provider.CreateScope())
            {
                scope.ServiceProvider.GetRequiredInstancce<MyDbContext>();
            }
        }
    }