[英].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.