考虑以下代码
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。
答案 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并注入这两个。然后您不必处理命名参数。