我试图让Ninject解析一个依赖关系树,要求它创建多个对象,具体取决于依赖关系的绑定数量。
例如,假设我有这种类型的系统:
public class A : IA
{
public A(IB[] bs) { /* ... */ }
}
public class B : IB
{
public B(IC c) { /* ... */ }
}
public class C1 : IC
{
public C1() { /* ... */ }
}
public class C2 : IC
{
public C2() { /* ... */ }
}
public interface IA { }
public interface IB { }
public interface IC { }
我可以将Ninject配置为执行此类操作吗?
var a = new A(new IB[]
{
new B(new C1()),
new B(new C2())
});
我不想创建一个采用多种IC类型的IB实现,因为IB在逻辑上与单个IC类型相关联。处理更高级别的IB实例要容易得多。
我希望这样做会有效:
var kernel = new StandardKernel();
kernel.Bind<IC>().To<C1>();
kernel.Bind<IC>().To<C2>();
kernel.Bind<IB>().To<B>();
kernel.Bind<IA>().To<A>();
var a = kernel.Get<IA>();
但它引发了一个例外:
Error activating IC
More than one matching bindings are available.
Matching bindings:
1) binding from IC to C1
2) binding from IC to C2
Activation path:
3) Injection of dependency IC into parameter c of constructor of type B
2) Injection of dependency IB into parameter bs of constructor of type A
1) Request for IA
答案 0 :(得分:0)
可能是为IB
+ IC
的所有组合创建多个绑定:
var kernel = new StandardKernel();
kernel.Bind<IB>().To<B>()
.WithParameter(
new TypeMatchingConstructorArgument(
typeof(IC),
(ctx, target) => ctx.Kernel.Get<C1>()));
kernel.Bind<IB>().To<B>()
.WithParameter(
new TypeMatchingConstructorArgument(
typeof(IC),
(ctx, target) => ctx.Kernel.Get<C2>()));
kernel.Bind<IA>().To<A>();
var a = kernel.Get<IA>();