我正在嘗試將依賴注入與單例一起使用,并且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每次使用時如何創建一個新實體?
uj5u.com熱心網友回復:
使用 MS.DI 決議單例時,該單例及其所有依賴項都從根范圍/容器中決議。這就是為什么您會遇到MyDbContext從注入決議IServiceProvider總是給出相同實體的行為的原因;該作用域實體的作用域是容器。換句話說,這個作用域實體隱式地變成了一個單例。
MS.DI 的閉包組合模型使得在單例中決議范圍變得非常困難(無需通過環境狀態手動管理范圍),因為范圍不能通過環境狀態無處不在,就像使用環境組合模型所做的那樣。
在實踐中,這里有兩種選擇:
- 您要么將單例組件的生活方式縮短為
Transient要么Scoped - 您從組件的方法中啟動和管理一個
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>(); } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/455324.html
