4

考虑以下代码

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;
    }
}

我想在dependency1中注入A,在dependency2中注入B。我知道我可以做这样的事情:

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

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

4

2 回答 2

2

当您注册您的ISomeInterface植入物时,您可以为它们命名

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即使某些参数不需要“命名”注册,您也必须指定所有构造函数参数。

因此,如果您只想指定“命名”参数,您可以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"));
于 2012-10-27T19:10:26.460 回答
1

首先,为什么要注入同一个接口的两个实例?一定是有什么区别他们的吗?

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

于 2012-10-28T08:47:39.590 回答