簡體   English   中英

我們可以注入具有不同變量的相同 class 的多個實例嗎?

[英]Can we inject multiple instances of the same class with different variables?

我們可以注入具有不同變量的相同 class 的多個實例嗎?

services.TryAddScoped<ISomeClass>(sp =>
{
    return new SomeClass(1);
});

services.TryAddScoped<ISomeClass>(sp =>
{
    return new SomeClass(2);
});

並且以某種方式將所需的拉到單獨的控制器中。

使用.TryAddScoped您只有一個類型實例,如果您使用.AddScoped您可以添加多個實例並在 controller 中接收一個 IEnumerable。

如果您需要命名實例,我已經創建了我的自定義解決方案:

public class NamedService<T>
{
    public string Name { get; set; }
    public T Service { get; set; }

    public NamedService(string name, T service)
    {
        Name = name;
        Service = service;
    }
}

擴展方法:

public static T GetService<T>(this IServiceProvider serviceProvider, string name = null) where T : class
{
    if (name != null)
    {
        var list = serviceProvider.GetServices<NamedService<T>>();
        return list.FirstOrDefault(n => n.Name == name)?.Service;
    }
    return serviceProvider.GetService<T>();
}

public static IServiceCollection AddScoped<T>(this IServiceCollection services, string name, Func<IServiceProvider, T> factory)
{
    return services.AddScoped(sp => new NamedService<T>(name, factory(sp)));
}

用法:

Services.AddScoped("some1", s => new SomeClass(1));
Services.AddScoped("some2", s => new SomeClass(2));

Controller:

public SomeController(IServiceProvider serviceProvider)
{
    var someInstance = serviceProvider.GetService<ISomeClass>("some1");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM