使用Autofac注入特定类型

时间:2013-05-22 18:57:05

标签: dependency-injection inversion-of-control ioc-container autofac

我想在满足某些条件时注入特定类型。例如,我有一个如下界面。

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<>功能,但无法解决问题。

1 个答案:

答案 0 :(得分:2)

听起来你违反了Liskov替代原则

  

现在由于一些架构限制,ServiceA必须将MyClassA作为构造函数参数,而ServiceB必须将MyClassB作为构造函数参数。

我不确定Autofac是否支持基于上下文的注入 - 为什么不让每个服务依赖于它所需的实现?

public class ServiceA
{
    private IMyInterface _interfaceClass;
    public ServiceA(MyClassA interfaceClass)
    {
        _interfaceClass = interfaceClass
    }
}