如何使用相同的接口注入两个或多个依赖项?

时间:2012-10-26 15:03:04

标签: c# autofac

考虑以下代码

public interface ISomeInterface
{
    void DoSomething();
}

public class A : ISomeInterface
{
    public void DoSomething() { }
}

public class B : ISomeInterface
{
    public void DoSomething() { }
}

然后一个类使用2个接口:

public class C : IC
{
    protected ISomeInterface _dependency1;
    protected ISomeInterface _dependency2;

    public C ( ISomeInterface dependency1, ISomeInterface dependency2 )
    {
        _dependency1 = dependency1;
        _dependency2 = dependency2;
    }
}

我想在dependency2中注入A,在dependency2中注入B.我知道我可以这样做:

builder.RegisterType<C>().As<IC>()
    .WithParameter( "dependency1", new A() )
    .WithParameter( "dependency2", new B() );

但我知道有更好的方法可以使用Autofac。

2 个答案:

答案 0 :(得分:2)

当您注册ISomeInterface植入时,您可以them a name

containerBuilder.RegisterType<A>().Named<ISomeInterface>("A");
containerBuilder.RegisterType<B>().Named<ISomeInterface>("B");

然后您可以使用定义的名称注册C来解决它的参数:

containerBuilder.Register(c =>
    new C(c.ResolveNamed<ISomeInterface>("A"), 
        c.ResolveNamed<ISomeInterface>("B")))
    .As<IC>();

使用上面的代码,您必须指定C的所有构造函数参数,即使某些参数不需要&#34;命名为&#34;注册

所以如果你只想指定&#34;命名&#34;参数可以与WithParameter一起使用解析:

containerBuilder.RegisterType<C>().As<IC>()
    .WithParameter((p, c) => p.Name == "dependency1", 
                   (p, c) => c.ResolveNamed<ISomeInterface>("A"))
    .WithParameter((p, c) => p.Name == "dependency2", 
                   (p, c) => c.ResolveNamed<ISomeInterface>("B"));

答案 1 :(得分:1)

首先,您为什么要注入两个相同接口的实例?它必须是能够区分它们的东西吗?

我的建议是注册两个子接口,即。 ISomeInterface1:ISomeInterface ISomeInterface2:ISomeInterface并注入这两个。然后您不必处理命名参数。