IoC / DI:当存在多个相同接口的实现时,如何注入特定实例

时间:2015-11-27 15:31:05

标签: c# dependency-injection inversion-of-control simple-injector

假设我们有两个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注入Consumer1Service2 {/ 1}},而不带使用工厂或单独的接口?

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

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

Consumer2

然后我得到一个例外

  

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

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

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>();

1 个答案:

答案 0 :(得分:1)

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

Given title</title>.*?\Knon_regd

您使用的是什么版本的SI?您确定使用的是[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); } 的正确实例吗?