[英].NET Core DI without constructor arguments
到目前為止,我一直使用 Unity IOC 容器來解決依賴關系,效果很好。 使用 Unity DI,我通常通過以下方式解析實例:
Public class TestClass {
public TestClass()
{
var instance = IOC.resolve<InterfaceClassToResolve>();
}
}
這很好用,但看到 .net 核心現在為我提供了一個開箱即用的 DI 容器,我更願意使用它 - 與 Unity IOC 相比只有一個問題,即它作為構造函數注入爭論,而不是像上面的例子那樣解決。
在大多數情況下,我認為它迫使我在多個類中鏈接我的依賴項,而不是僅僅在實際需要它們的類中解決我的依賴項。
我一直在尋找解決這個問題的方法,據我所知,唯一的選擇是做這樣的事情:
Public class TestClass {
public TestClass(IServiceProvider serviceProvider)
{
var instance = serviceProvider.GetService<InterfaceClassToResolve>();
}
}
然后我們又回到了原點……
因此,我是否錯過了 .net 核心 IOC 背后的某些功能,或者為什么大多數示例希望我通過構造函數參數使用 .net 核心 IOC?
正如已經評論過的,服務定位器模式不是最好的方法,被認為是一種反模式。 不過,我理解找到一種方法可以輕松地將現有代碼轉換為開箱即用的 DI 系統而不會發瘋的必要性。 因此,我建議您執行以下操作:
1)Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DatabaseContext>(
options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// other services configuration here
// IMPORTANT: This should be the last line of ConfigureServices!
IOC.CurrentProvider = services.BuildServiceProvider();
}
...
2) 國際奧委會.cs
public class IOC
{
public static IServiceProvider CurrentProvider { get; internal set; }
public static T resolve<T>()
{
return CurrentProvider.GetService<T>();
}
}
這應該允許您將 dotnet core DI 與基於 Unity 的現有服務定位器代碼一起使用,只需最少的修復(基本上只是一些需要修復的 using 聲明),只要您鄭重承諾盡快重構您的代碼以擺脫所有服務定位器代碼:D
您可以在沒有構造函數的情況下使用 DI,例如:
在ConfigureServices
services.AddSingleton<YourClass>()
然后像這樣注入它:
private YourClass YourClass
{
get
{
return this.serviceProvider.GetRequiredService<YourClass>();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.