0

Я пытаюсь выполнить контекстную привязку, но не могу связать конкретный интерфейс реализации в качестве аргумента конструктора. Ninject версия: 3.2.0.0Связать интерфейс с несколькими конкретными реализациями с аргументом конструктора

Моя структура выглядит следующим образом:

INotifier 1. XNotifier 2. YNotifier

IPublisher 1. APublisher 2. 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>()); 

Использование:

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

Но получить следующие ошибки:

Ошибка активирующего INotifier Нет соответствующих привязок не доступны, и тип не является самопереключаемым.

+0

Почему вы передаете параметр в '' Получить ? – MaKCbIMKo

+0

@MaKCbIMKo: Конструктор класса, который реализует INotifier, ожидает конкретной реализации IPublisher. – AnandSonake

+0

Но вы уже указали аргумент конструктора в своих привязках. Почему вы снова это делаете? – MaKCbIMKo

ответ

0

Ваш образец кода использует локальное значение из того места, где выполняется привязка. Я размышляю, что это неправильно = не то, что вы хотите.

Ошибка возникает, потому что ни одно из условий When не совпадает с моментом, когда привязка была разрешена. Или другими словами: в то время, когда Ninject просят вернуть INotifier, он будет оценивать все условия привязок INotifier, а затем разрешить ту, которая соответствует.

When Условия использования должны использоваться только в том случае, если во время выполнения иногда вы хотите создать экземпляр «A» и другие времена «B». Если во время создания экземпляра ядра это уже известно, какие делать, то вы должны адаптировать свой код следующим образом:

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