我有以下类结构:
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/