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