Привязать интерфейс к множественной конкретной реализации с аргументом конструктора

Я пытаюсь сделать контекстное связывание, но не могу связать конкретный интерфейс реализации в качестве аргумента конструктора. 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. Соответствующие привязки отсутствуют, а тип не является самосвязываемым.

1 ответ

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

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

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

if(notifictionControl.ToLower() == "xnotification")
{
    Bind<INotifier>()...
}
else if(notifictionControl.ToLower() == "ynotification")
{
    Bind<INotifier>()...
}
else
{ 
    throw new Exception("invalid config");
}
Другие вопросы по тегам