c# - 依赖注入(inject) ASP.NET Core : Register multiple implementations

标签 c# asp.net-core dependency-injection asp.net-core-2.1

我有以下类结构:

interface IContractService{}

class Service1 : IContractService{}

class Service2 : IContractService{}

class ContractServiceFactory
{
    private readonly IServiceProvider _serviceProvider;
     ContractServiceFactory(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;            
    }
     IContractService GetContractService(string standard)
    {
        // Is it possible to retrieve service by string const???
        return _serviceProvider.GetRequiredService<IContractService>(standard);
    }
}

在服务集合中,我想通过以下方式添加我的类:

builder.Services.AddScoped<IContractService, ContractService1>("standard1");
builder.Services.AddScoped<IContractService, ContractService2>("standard2");

在 .net core 2.1 中可以吗?

最佳答案

你可以使用工厂来做到这一点:

所以首先您需要定义您的 2 个服务:

services.AddScoped<Service1>();
services.AddScoped<Service2>();

services.AddScoped<Func<int, IContractService>>(serviceProvider=> key=>
{
    switch(key)
    {
        case 1:
           return serviceProvider.GetService<Service1>();
        case 2:
           return serviceProvider.GetService<Service2>();
        default:
            throw new Exception("Not valid key");
    }
});

此处为 GetService 的 docs.microsoft ,您可以使用某种枚举而不是普通的 int

之后在你的 Controller 中:

public class HomeController:Controller
{

    private readonly Service1 _service1;   

    public HomeController(Func<int, IContractService> serviceProvider)
    {
        _service1 = serviceProvider(1);            
    }

}

关于c# - 依赖注入(inject) ASP.NET Core : Register multiple implementations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51897038/

相关文章:

以单声道编译的 C# - 检测操作系统

C#相当于覆盖类中的__dict__

c# - 执行队列

java - 为 spring ConfigurationProperties 子类使用构造函数注入(inject)

java - 使用 Spring JdbcTemplate - 注入(inject)数据源与 jdbcTemplate

c# - 静态类的克隆

asp.net - asp.net-vnext 中的旧程序集引用错误

c# - 带有 cookie 中间件的 asp.net core - 访问授权请求数据

c# - Entity Framework 代码中所有属性的必需规则优先

c# - 使用单个接口(interface)注册多个实现