繁体   English   中英

.NET Core DI 没有构造函数参数

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM