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