C# 如何使用同一接口注入两个或多个依赖项?

C# 如何使用同一接口注入两个或多个依赖项?,c#,autofac,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 { p

考虑以下代码

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() );
builder.RegisterType().As()
.WithParameter(“dependency1”,新A())
.WithParameter(“dependency2”,新的B());

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

当您注册您的
ISomeInterface
植入时,您可以:

使用上述代码时,您必须指定
C
的所有构造函数参数,即使某些参数不需要“命名”注册

因此,如果您只想指定“命名”参数,可以将
与parameter
一起使用解析:

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"));
containerBuilder.RegisterType().As()
.WithParameter((p,c)=>p.Name==“dependency1”,
(p,c)=>c.A.)
.WithParameter((p,c)=>p.Name==“dependency2”,
(p,c)=>c.B;

首先,为什么要插入同一接口的两个实例?这一定是他们的与众不同之处吧


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

您是否尝试过一个数组或
IEnumerable
?这可能会起作用,但想象一下,我有很多对象实现了ISomeInterface,而很多对象只使用了其中的几组。最糟糕的是,我将在未来实施一些。然后,在消费者中,我希望在数量上保持透明。在ninject中,我可以在每个参数之前放置一个name属性,然后使用该名称进行绑定。我不想用Autofac做这样的事,那会管用的。但我不是在寻找解决方案,我是在寻找最好的解决方案。我正在努力掌握Autofac:-)
containerBuilder.Register(c =>
    new C(c.ResolveNamed<ISomeInterface>("A"), 
        c.ResolveNamed<ISomeInterface>("B")))
    .As<IC>();
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"));