簡體   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