2012-07-26 4 views
7

I는 다음의 클래스 가지고Ninject에 여러

using System; 

interface IA { } 

class A1 : IA { } 

class A2 : IA { } 

class B 
{ 
    public B(IA a) {} 
} 

class BProvider : Provider<B> 
{ 
    IA _a; 

    public BProvider(IA a) { _a=a; } 

    protected override B CreateInstance(IContext context) { return new B(_a); } 
} 

Ninject에 모듈로드() 코드 :

Bind<IA>().To<A1>(); 
Bind<IA>().To<A2>(); 
Bind<B>().ToProvider<BProvider>(); 

메인 코드 :

kernel.GetAll<IA>(); // works fine 
kernel.GetAll<B>(); // I expect to get IEnumerable<B> with two elements, but instead of this I get an error that there are multiple bindings of IA and ninject cannot determine which to use 

그래서 질문이다 마지막 문장을 예상대로 작동 시키거나 다른 방법으로 할 수 있습니까?

답변

2

Ninject가 BProvider 유형의 개체 인스턴스를 만들어야하기 때문에 예외가 throw됩니다. 이를 수행하려면 IA에 대한 종속성을 입력해야합니다. 하지만 잠시 ... IA에 바인딩이 두 개 있는데 어느 하나를 선택해야합니까? ...

어떤 조건부 바인딩을 사용하여 어떤 구현을 사용해야하는지 결정할 수 있습니다. 한 가지 방법은 NamedAttribute 함께 : A1은 NamedAttribute가 지정되지 않은 기본으로 주입 될 것이다이 경우

Bind<IA>().To<A1>(); 
Bind<IA>().To<A2>().Named("SecondImpl"); 
Bind<B>().ToProvider<BProvider>(); 


class BProvider : Provider<B> 
{ 
    IA _a; 

    public BProvider([Named("SecondImpl")]IA a) { _a=a; } 

    protected override B CreateInstance(IContext context) { return new B(_a); } 
} 

.

또는 @Remo GLOOR 같은

이 게시물에 설명 :이 비트 청소기 Configuring Ninject

Bind<IA>().To<A1>(); 
Bind<IA>().To<A2>().WhenParentNamed("NeedSecondImpl"); 
Bind<B>().ToProvider<BProvider>().Named("NeedSecondImpl"); 

, 당신은 Ninject에에 코드를 묶을 필요 없다 그냥 (한 곳에서) 구성에 그것을 할 수 있기 때문이다.