0

컨텍스트 바인딩을 시도하지만 생성자 인수로 구체적인 구현 인터페이스를 바인딩 할 수 없습니다. Ninject에 버전은 다음 3.2.0.0생성자 인수로 여러 구체 구현에 바인드 인터페이스

내 구조이므로 :

INotifier에게 1. 2. XNotifier YNotifier

IPublisher을 1. 2. APublisher BPublisher

XNotifier로서 YNotifier는 IPublisher 유형의 생성자 인수를 취합니다. 여기

은 구속력이 내가 가진 :

Bind<INotifier>() 
      .To<XNotifier>() 
      .When(x => notifictionControl.ToLower() == "xnotification") 
      .WithConstructorArgument("Publisher",ctx=>Kernel.Get<IPublisher>()); 


     Bind<INotifier>() 
     .To<YNotifier>() 
     .When(x => notifictionControl.ToLower() == "ynotification") 
     .WithConstructorArgument("Publisher", ctx => Kernel.Get<IPublisher>()); 

사용법 : INotifier 일치하는 바인딩을 사용할 수 없으며, 활성화

오류 :

IParameter parameter = new ConstructorArgument("Publisher", publisher); 
     var notifier = kernel.Get<INotifier>(parameter); 

그러나 점점 오류 다음 유형은 자기 구속력이 없습니다.

+0

왜''을 받기에 매개 변수를 전달합니까? – MaKCbIMKo

+0

@MaKCbIMKo : INotifier를 구현 한 클래스의 생성자는 IPublisher의 구체적 구현을 ​​기대합니다. – AnandSonake

+0

하지만 바인딩에 생성자 인수가 이미 지정되어 있습니다. 왜 다시 할 수 있니? – MaKCbIMKo

답변

0

샘플 코드에서 바인딩이 수행 된 곳의 로컬 값을 사용하고 있습니다. 나는 이것이 잘못된 것이라고 생각하고 있습니다 = 당신이 원하는 것이 아닙니다.

When 조건이 바인딩이 해결 될 때 일치하지 않으므로 오류가 발생합니다. 다른 말로하면 : Ninject가 INotifier을 반환하라는 요청을 받았을 때 INotifier 바인딩의 모든 When 조건을 평가 한 다음 일치하는 것을 확인합니다.

When 조건은 런타임 중에 "A"와 다른 시간 "B"를 인스턴스화하려는 경우에만 사용해야합니다. 커널의 인스턴스화하는 동안 이미 할 수있는 알려진 경우에, 당신은과 같이 코드를 적용해야합니다

if(notifictionControl.ToLower() == "xnotification") 
{ 
    Bind<INotifier>()... 
} 
else if(notifictionControl.ToLower() == "ynotification") 
{ 
    Bind<INotifier>()... 
} 
else 
{ 
    throw new Exception("invalid config"); 
}