IoC/DI:当同一接口有多个实现时,如何注入特定实例

本文关键字:何注入 注入 实例 实现 DI 接口 IoC | 更新日期: 2023-09-27 18:24:50

假设我们有两个IService接口的实现:

public interface IService { }
public class Service1 : IService { }
public class Service2 : IService { }

然后我们有两个依赖于IService的类:

public class Consumer1
{
    public Consumer1(IService svc) { }
}
public class Consumer2
{
    public Consumer2(IService svc) { }
}

现在,如何使用Simple Injector作为依赖容器将Service1注入Consumer1,并在不使用工厂或单独接口的情况下Service2注入Consumer2

如何归档的通用模式(与特定的DI容器无关)也很棒:)

更新
我已经尝试过使用SimpleInjector进行基于上下文的注入。文档非常有限,我最终得到了以下代码:

container.RegisterConditional(
    typeof(IService),
    typeof(Service1),
    Lifestyle.Transient,
    c => c.Consumer.ImplementationType == typeof(Consumer1));
container.RegisterConditional(
    typeof(IService),
    typeof(Service2),
    Lifestyle.Transient,
    c => c.Consumer.ImplementationType == typeof(Consumer2));
container.Register<Consumer1>();
container.Register<Consumer2>();

但后来我得到了一个异常

配置无效。为类型Consumer1创建实例失败。Consumer1类型的构造函数包含未注册的名为"svc"、类型为IService的参数。请确保IService已注册,或者更改Consumer1的构造函数。存在适用于IService的IService的1个条件注册,但当为Consumer1提供上下文信息时,其提供的谓词没有返回true。

我尝试过谓词的不同变体,但没有成功。。。

c => c.Consumer.Target.TargetType == typeof(Consumer1)
c => c.Consumer.ServiceType == typeof(Consumer1)

IoC/DI:当同一接口有多个实现时,如何注入特定实例

我无法在SI的最新版本(3.1)中重现此问题。此测试通过:

[Test]
public void Test1()
{
    var container = new Container();
    container.RegisterConditional<IService, Service1>(
        c => c.Consumer.ImplementationType == typeof(Consumer1));
    container.RegisterConditional<IService, Service2>(
        c => c.Consumer.ImplementationType == typeof(Consumer2));
    container.Register<Consumer1>();
    container.Register<Consumer2>();
    container.Verify();
    var result1 = container.GetInstance<Consumer1>();
    var result2 = container.GetInstance<Consumer2>();
    Assert.IsInstanceOf<Service1>(result1.Svc);
    Assert.IsInstanceOf<Service2>(result2.Svc);
}

您使用的SI版本是什么?您确定使用的是正确的container实例吗?