Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们可以用不同的变量注入同一类的多个实例吗?_C#_.net_.net Core_Dependency Injection - Fatal编程技术网

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

C# 我们可以用不同的变量注入同一类的多个实例吗?,c#,.net,.net-core,dependency-injection,C#,.net,.net Core,Dependency Injection,我们可以用不同的变量注入同一类的多个实例吗 services.TryAddScoped<ISomeClass>(sp => { return new SomeClass(1); }); services.TryAddScoped<ISomeClass>(sp => { return new SomeClass(2); }); services.TryAddScoped(sp=> { 返回新的SomeClass(1); }); 服务。TryA

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

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

services.TryAddScoped<ISomeClass>(sp =>
{
    return new SomeClass(2);
});
services.TryAddScoped(sp=>
{
返回新的SomeClass(1);
});
服务。TryAddScoped(sp=>
{
返回新的SomeClass(2);
});

并以某种方式将所需的实例拉入单独的控制器。

使用
.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 SomeController(IServiceProvider serviceProvider)
{
    var someInstance = serviceProvider.GetService<ISomeClass>("some1");
}
公共SomeController(IServiceProvider服务提供商)
{
var someInstance=serviceProvider.GetService(“some1”);
}

控制器如何知道要拉哪一个?你可以使用
IEnumerable
将它们全部拉入,然后过滤得到你想要的,但这并不优雅。谢谢@IanMercer。不确定也许是名字什么的?围绕作品而工作,但真实,不优雅。因此希望看到更好的选择。如果您使用Autofac,您可以使用元数据:但您的用例是什么?为什么不能使用接口实现它?您的意思是,让多个接口从同一个实现类继承?使用控制器中我需要的接口?你能解释一下SomeClass(1)和SomeClass(2)的区别吗?它们是否可以是具有额外接口的不同具体实例?其他选项:(ii)注入
Func
工厂?(iii)使用lambda注册调用类,该lambda使用
GetRequiredService()
,然后过滤以获取它所需的类-但所有这些都在注册中处理,而不更改任何一个类?
Services.AddScoped("some1", s => new SomeClass(1));
Services.AddScoped("some2", s => new SomeClass(2));
public SomeController(IServiceProvider serviceProvider)
{
    var someInstance = serviceProvider.GetService<ISomeClass>("some1");
}