2016-06-14 32 views
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 
+0

Ninject可以做到這一點,只要你沒有循環依賴。 – Win

+0

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/ –

+0

一家工廠首先吐出一個'C1',那麼'C2'就可以做到這一點。 – spender

回答

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>(); 
相關問題