Избегание множественных привязок с наследованием Ninject Extensions
У меня есть классы, которые создают иерархию, такую как эта:
public interface IHandler<T, T2> {
}
public class BaseHandler : IHandler<T, T2> {
}
public class DerivedHandler : BaseHandler {
}
По сути, идея заключается в том, что функциональность может быть сложена (каждый производный уровень будет добавлять больше функциональности).
Я пытаюсь использовать Расширения Ninject Conventions, чтобы связать это хорошим способом. Что у меня есть это:
kernel.Bind(
x =>
x.FromAssemblyContaining(typeof(IHandler<,>))
.SelectAllClasses()
.EndingWith("Handler")
.BindAllInterfaces());
Это работает безупречно, когда я запрашиваю DerivedHandler
, Ninject вообще не жалуется. Тем не менее, когда я прошу BaseHandler
Мне преподносят:
Доступно несколько подходящих привязок.
Очевидно, что расширение конвенций учитывает наследование. Когда я запрашиваю BaseHandler
.. это должно дать мне BaseHandler
или DerivedHandler
? (Я хочу BaseHandler
..).
Есть ли способ избежать этого? Я перепробовал все виды комбинаций свободного синтаксиса, и я могу получить либо ошибку "Несколько привязок", либо ошибку "Не найдено привязок".
Обратите внимание, что это работает отлично, если я вручную свяжу каждый из них. Я предполагаю, что это доказывает, что нет никаких проблем с Ninject, занимающимися этим.. это просто конвенции.
1 ответ
В вашем примере вы запрашиваете конкретный (класс-) тип, для которого вы хотите создать экземпляр.
Вместо привязки .BindAllInterfaces()
вам нужно использовать .BindToSelf()
в конвенции.
Однако, если вам больше не нужно настраивать привязку (например,.InSingletonScope() или.OnActivation()...), вы также можете пропустить привязку, потому что всякий раз, когда вы запрашиваете несвязанный тип класса, ninject попытается создать экземпляр запрошенного типа.
Полный пример:
kernel.Bind(x => x
.FromAssemblyContaining(typeof(IHandler<,>))
.SelectAllClasses()
.EndingWith("Handler")
.BindToSelf());