考虑以下代码
public interface ISomeInterface
{
void DoSomething();
}
public class A : ISomeInterface
{
public void DoSomething() { }
}
public class B : ISomeInterface
{
public void DoSomething() { }
}
然后一个类使用 2 个接口(interface):
public class C : IC
{
protected ISomeInterface _dependency1;
protected ISomeInterface _dependency2;
public C ( ISomeInterface dependency1, ISomeInterface dependency2 )
{
_dependency1 = dependency1;
_dependency2 = dependency2;
}
}
我想在 dependency1 中注入(inject) A,在 dependency2 中注入(inject) B。我知道我可以做这样的事情:
builder.RegisterType<C>().As<IC>()
.WithParameter( "dependency1", new A() )
.WithParameter( "dependency2", new B() );
但我知道使用 Autofac 有更好的方法。
最佳答案
当您注册您的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
的所有构造函数参数。
因此,如果您只想指定“命名”参数,您可以将 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"));
关于c# - 如何使用同一接口(interface)注入(inject)两个或多个依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089454/