2

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

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

4

1 回答 1

2

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

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

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

public class ServiceA
{
    private IMyInterface _interfaceClass;
    public ServiceA(MyClassA interfaceClass)
    {
        _interfaceClass = interfaceClass
    }
}
于 2013-05-23T13:47:33.913 回答