Dependency injection 使用Autofac注入特定类型

Dependency injection 使用Autofac注入特定类型,dependency-injection,inversion-of-control,ioc-container,autofac,Dependency Injection,Inversion Of Control,Ioc Container,Autofac,我想在满足某些条件时注入特定类型。例如,我有一个如下的界面 public interface IMyInterface{ } 还有两个实现这个接口的类 public class MyClassA : IMyInterface { } 及 最后,我有一个服务类,它获取一个构造函数参数作为IMyInterface public class ServiceA{ private IMyInterface _interfaceClass; public ServiceA(IMyInterface i

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

public interface IMyInterface{

}
还有两个实现这个接口的类

public class MyClassA : IMyInterface {
}

最后,我有一个服务类,它获取一个构造函数参数作为IMyInterface

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

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

通常我使用的是如下所示的Autofac

var builder = new ContainerBuilder();
builder.RegisterType<MyClassA>().As<IMyInterface>().InstancePerApiRequest();
var builder=newcontainerbuilder();
builder.RegisterType();
但我找不到如何强制Autofac为特定类型选择正确的类型。
我查看了
命名的
功能,但无法解决问题。

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

现在,由于一些架构约束,ServiceA必须将MyClassA作为构造函数参数,ServiceB必须将MyClassB作为构造函数参数


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

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

实际上,您可能是对的,我没有尝试使用类类型作为参数类型。感谢您回答“使每个服务依赖于它所需的实现”。不幸的是,这将导致违反接口隔离原则。这里的问题是设计中存在歧义。最好将
MyClassA
MyClassB
分别隐藏在不同的抽象后面,以完全避免歧义。Autofac支持基于上下文的注入:可能重复
var builder = new ContainerBuilder();
builder.RegisterType<MyClassA>().As<IMyInterface>().InstancePerApiRequest();
public class ServiceA
{
    private IMyInterface _interfaceClass;
    public ServiceA(MyClassA interfaceClass)
    {
        _interfaceClass = interfaceClass
    }
}