我想在满足某些条件时注入特定类型。例如,我有一个如下界面。
public interface IMyInterface{
}
还有两个实现此接口的类
public class MyClassA : IMyInterface {
}
和
public class MyClassB : IMyInterface {
}
最后我有一些服务类,它将构造函数参数作为IMyInterface获取。
public class ServiceA{
private IMyInterface _interfaceClass;
public ServiceA(IMyInterface interfaceClass){
_interfaceClass = interfaceClass
}
}
和
public class ServiceB{
private IMyInterface _interfaceClass;
public ServiceA(IMyInterface interfaceClass){
_interfaceClass = interfaceClass
}
}
现在由于一些架构限制 ServiceA必须将MyClassA作为构造函数参数,而 ServiceB必须将MyClassB作为构造函数参数。
通常我正在使用如下的Autofac
var builder = new ContainerBuilder();
builder.RegisterType<MyClassA>().As<IMyInterface>().InstancePerApiRequest();
但我找不到如何强制Autofac为特定类型选择正确类型的方法。
我查看Named<>
功能,但无法解决问题。
答案 0 :(得分:2)
听起来你违反了Liskov替代原则
现在由于一些架构限制,ServiceA必须将MyClassA作为构造函数参数,而ServiceB必须将MyClassB作为构造函数参数。
我不确定Autofac是否支持基于上下文的注入 - 为什么不让每个服务依赖于它所需的实现?
public class ServiceA
{
private IMyInterface _interfaceClass;
public ServiceA(MyClassA interfaceClass)
{
_interfaceClass = interfaceClass
}
}