[英]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所做的那樣。
實際上,這里有兩種選擇:
Transient
或Scoped
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.