假设我们有以下课程:
class MyOptions{
public IManager MyManager { get; set; }
}
当前,IManager
接口有两种实现。我们称它们为ManagerA和ManagerB:
class ManagerA:IManager {}
class ManagerB:IManager {}
在启动期间,我只会对创建类型为ManagerA
或ManagerB
的单个对象感兴趣,并且可以通过MyOptions.MyManager
属性访问该实例。有谁知道如何在ASP.NET Core依赖项注入系统中注册它?我尝试在启动过程中使用lambda:
builder.Services.TryAddEnumerable(
ServiceDescriptor.Scope<IGestorCertificados>(ctx => myOptions.MyManager));
即使可以编译,我在运行时也会遇到异常:
实现类型不能为“ IManager”,因为它与为“ IManager”注册的其他服务没有区别。
有人可以帮忙吗?您如何解决这个问题?我是否真的需要重构代码,以便lambda显式返回类型A或类型B?
谢谢
路易斯
答案 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);
}