【问题标题】:Can we inject multiple instances of the same class with different variables?我们可以注入具有不同变量的同一类的多个实例吗?
【发布时间】:2021-03-25 21:53:52
【问题描述】:

我们可以用不同的变量注入同一个类的多个实例吗?

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

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

然后以某种方式将需要的控制器拉入单独的控制器中。

【问题讨论】:

  • 控制器如何知道要拉哪一个?您可以使用IEnumerable&lt;&gt; 将它们全部拉入,然后过滤以获取您想要的,但这并不优雅。
  • 感谢@IanMercer。不确定可能是名字还是什么?解决工作,但真实,不优雅。因此希望看到任何更好的选择。
  • 如果你使用 Autofac,你可以使用元数据:autofaccn.readthedocs.io/en/latest/advanced/metadata.html 但你的用例是什么,为什么你不能使用接口来实现它?
  • 你的意思是多个接口继承自同一个实现类?并在控制器中使用我需要的接口?
  • 你能解释一下 SomeClass(1) 和 SomeClass(2) 的区别吗?它们可以是具有额外接口的不同具体实例吗?其他选项:(ii)注入Func&lt;int,SomeClass&gt; 工厂? (iii) 用一个使用 GetRequiredService&lt;IEnumerable&lt;ISomeClass&gt;&gt;() 的 lambda 注册调用类,然后过滤以获得它需要的类 - 但所有这些都在注册中处理而不更改任何一个类?

标签: c# .net .net-core dependency-injection


【解决方案1】:

使用.TryAddScoped,您只有一个类型实例,如果您使用.AddScoped,您可以添加多个实例并在您的控制器中接收一个 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));

控制器:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2014-03-06
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多