ASP.NET Core DI:如何通过lambda注入服务而不指定类型

时间:2018-08-01 13:50:49

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

假设我们有以下课程:

 class MyOptions{
    public IManager MyManager { get; set; }
 }

当前,IManager接口有两种实现。我们称它们为ManagerA和ManagerB:

class ManagerA:IManager {}
class ManagerB:IManager {}

在启动期间,我只会对创建类型为ManagerAManagerB的单个对象感兴趣,并且可以通过MyOptions.MyManager属性访问该实例。有谁知道如何在ASP.NET Core依赖项注入系统中注册它?我尝试在启动过程中使用lambda:

builder.Services.TryAddEnumerable(
   ServiceDescriptor.Scope<IGestorCertificados>(ctx => myOptions.MyManager));

即使可以编译,我在运行时也会遇到异常:

  

实现类型不能为“ IManager”,因为它与为“ IManager”注册的其他服务没有区别。

有人可以帮忙吗?您如何解决这个问题?我是否真的需要重构代码,以便lambda显式返回类型A或类型B?

谢谢

路易斯

1 个答案:

答案 0 :(得分:0)

  

在启动期间,我只会对创建一个ManagerA或ManagerB类型的对象感兴趣

这意味着在启动时就知道要使用的类,这通常意味着在配置文件中指定了该值。

您应该做的是读取配置值并注册任一管理器类。例如:

string manager = configuration["manager"];

switch (manager)
{
    case "A": services.AddTransient<IManager, ManagerA>();
    case "B": services.AddTransient<IManager, ManagerB>();
    default: throw new ConfigurationErrorsException("Unknown value " + manager);
}