0

Возможно ли, чтобы Ninject получил все экземпляры, которые наследуются от определенного абстрактного класса? Например, у меня есть следующий абстрактный класс.Ninject: экземпляры GetAll, которые наследуются от одного и того же абстрактного класса

public abstract class MyAbstractClass { } 

Тогда у меня есть следующие два производных класса, которые наследуются от одного и того же абстрактного класса.

public class MyDerivedClass1 : MyAbstractClass { } 

public class MyDerivedClass2 : MyAbstractClass { } 

Теперь я собираюсь связать обе производные классы с ядром, потому что я хочу, чтобы они были в одноплодной области.

_kernel = new StandardKernel(); 
_kernel.Bind<MyDerivedClass1>().ToSelf().InSingletonScope(); 
_kernel.Bind<MyDerivedClass2>().ToSelf().InSingletonScope(); 

Я знаю, что ядро ​​может вернуть мне экземпляр, подобный следующему.

_kernel.Get<MyDerivedClass1>(); 

Есть ли способ получить все классы, которые наследуются от MyAbstractClass? Я пробовал следующее без успеха.

IEnumerable<MyAbstractClass> items = kernel.GetAll<MyAbstractClass>(); 

Надежда была, что описанный выше способ GETALL() будет возвращать список из двух экземпляров, один будет MyDerivedClass1, а второй будет MyDerivedClass2.

ответ

2

вместо создания двух привязок, второй с «перенаправить» к первому, что вы можете сделать это:

_kernel.Bind<MyAbstractClass, MyDerivedClass1>() 
     .To<MyDerivedClass1>().InSingletonScope(); 
_kernel.Bind<MyAbstractClass, MyDerivedClass2>() 
     .To<MyDerivedClass1>().InSingletonScope(); 

Это выражает намерение более четко.

+0

Спасибо, что сделал трюк с меньшим количеством кода! Возможно ли создать такой синтаксический привязку для всех классов, которые наследуются от MyAbstractClass автоматически? Может быть, какая-то комбинация Ninect и Reflection, которая найдет все конкретные классы, которые наследуются от MyAbstractClass? – Eric

+0

@eric да. Для этого вы можете использовать [Ninject.Extensions.Conventions] (https://github.com/ninject/ninject.extensions.conventions). Если вам нужна дополнительная информация, вероятно, уже есть вопрос о SO, охватывающий это или аналогичный сценарий. Если нет, вы можете, конечно, задать новый вопрос. – BatteryBackupUnit

2

В настоящее время вы привязываетесь только к типу реализации, а не к типу базового класса, с ToSelf. Это эффективно вызывая _kernel.Bind<MyDerivedClass1>().To<MyDerivedClass1>()

Чтобы связать типы реализации с использованием базового типа:

_kernel = new StandardKernel(); 
_kernel.Bind<MyAbstractClass>().To<MyDerivedClass1>().InSingletonScope(); 
_kernel.Bind<MyAbstractClass>().To<MyDerivedClass2>().InSingletonScope(); 

//returns both 
var allImplementations = _kernel.GetAll<MyAbstractClass>(); 

EDIT: Несколько привязок к Синглтон.

_kernel = new StandardKernel(); 
_kernel.Bind<MyDerivedClass1>().ToSelf().InSingletonScope(); 
_kernel.Bind<MyDerivedClass2>().ToSelf().InSingletonScope(); 

_kernel.Bind<MyAbstractClass>().ToMethod(x => _kernel.Get<MyDerivedClass1>()); 
_kernel.Bind<MyAbstractClass>().ToMethod(x => _kernel.Get<MyDerivedClass2>()); 
+0

Awesome! Это было именно то, что мне нужно. Спасибо. – Eric

+0

Я не уверен, что InSingletonScope работает так, как ожидалось. Когда я вызываю _kernel.GetAll (), я вижу, что конструктор вызывается для MyDerivedClass1 и MyDerivedClass2, как и ожидалось, но когда я вызываю _kernel.Get (), я вижу, что его конструктор снова вызван. Я надеюсь, что этот вызов Get () просто вернет текущий экземпляр MyDerivedClass1, созданный из вызова GetAll . – Eric

+0

'_kernel.Get ()' ищет привязку экземпляра/типа к 'MyDerivedClass'. Ninject немного раздражает, чтобы использовать один и тот же экземпляр для нескольких привязок. См. Мое редактирование для этого. – Xenolightning

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

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