2
我試圖讓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
Ninject可以做到這一點,只要你沒有循環依賴。 – Win
IMO,您已經越過了[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)成爲比使用DI容器更好的選擇。你基本上正在創建一個「複雜的對象圖」。有關更多詳細信息,請參見我的文章:http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/ –
一家工廠首先吐出一個'C1',那麼'C2'就可以做到這一點。 – spender