2016-09-02 10 views
2

У меня есть общий тип IMyGeneric<T> where T : IBase.Получить все типы, наследующие общие ограничения в Ninject

Как я могу получить все типы inherit IMyGeneric<T> в ninject?

Я попытался это:

this.kernel.GetAll<IMyGeneric<IBase>>(); 

но это не работает, и его возвращение 0 результатов.

я мог бы получить все, что наследующий IBase, а затем foreach всех типов и использовать this.kernel.Get(type), но тогда я бы IEnumerable<object> и не IEnumerable<IMyGeneric<IMyInheritedType>> и не смогли бы бросить и вернуться затем в качестве определенного типа, например, IEnumerable<IMyGeneric<IBase>>, потому что я получаю ошибку при произведении.

+0

Преобразование '' IMyGeneric к '' IMyGeneric будет работать только тогда, когда интерфейс определяется как тип варианта: '' IMyGeneric , но даже тогда я не думаю, что на самом деле Ninject поддерживает это. Поэтому, даже если вы зарегистрируете список различных типов «IMyGeneric », Ninject, вероятно, не получит эти типы для вас. – Steven

+0

Любой другой способ получить все реализации на основе ограничений? Или создать IBaseConstraint (только для ограничения), а затем получить все через IBase? Хотя мне не очень нравится эта идея. – zhuber

+0

Возможно, вам захочется показать больше фактической реализации, которую мы вам предоставим, чтобы предоставить вам отзывы о том, как действовать. – Steven

ответ

1

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

  1. если запрашиваемый тип instanciatable (например, когда вы запрашиваете FooClass и FooClass содержит доступный конструктор).
  2. открытых родовые привязки (у вас есть замкнутые общие, так что здесь не поможет)

означает, что если вы хотите, чтобы решить несколько IMyGeneric<IBase> вам нужно будет зарегистрировать несколько:

Bind<Apple>().To<IMyGeneric<IBase>>(); 
Bind<Pear>().To<IMyGeneric<IBase>>(); 

или , если эти типы должны быть решаемы несколько типов:

Bind(typeof(Apple)).To(typeof(IMyGeneric<IBase>), typeof(IMyGeneric<Apple>)); 

Вместо того чтобы вручную определить все привязки вы можете использовать Conventions Extension и воспользуйтесь настраиваемым IBindingGenerator, чтобы создать привязки. Или, конечно, вы также можете написать свой собственный помощник, основанный на отражении.

 Смежные вопросы

  • Нет связанных вопросов^_^