簡體   English   中英

具有單例依賴注入的實體框架核心

[英]Entity Framework Core with dependency injection with singletons

我正在嘗試將依賴注入與 singleton 和DBContext.

在 .net 框架中我可以做這樣的事情

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

但是,當我現在這樣做時,出現以下錯誤:

無法解析類型為“System.Func`1 [MyDbContext]”的服務

我確實嘗試將其添加到構造函數中。

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

但是, serviceProvider返回相同的實例

每次使用MyDbContext時如何創建一個新實例?

當使用 MS.DI 解析 singleton 時,singleton及其所有依賴項都從根作用域/容器中解析。 這就是為什么您會遇到從注入的IServiceProvider解析MyDbContext總是給出相同實例的行為; 該作用域實例的作用域為容器。 換句話說,該作用域實例隱式變為 singleton。

MS.DI 的Closure Composition Model使得在單例中解析范圍變得非常困難(無需通過環境狀態手動管理范圍),因為范圍並非通過環境 state 普遍可用,就像使用環境組合 Model所做的那樣。

實際上,這里有兩種選擇:

  1. 您可以將 singleton 組件的生命周期縮短為TransientScoped
  2. 您從組件的方法中啟動和管理IServiceScope ,並從 scope 解析作用域組件。例如:
     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>(); } } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM