Ninject Binding, интерфейс для интерфейса - PullRequest
2 голосов
/ 29 ноября 2011

Я хочу сделать что-то вроде этого:

kernel.Bind<IBootTaskA>().To<BootTaskA>().InSingletonScope();
kernel.Bind<IBootTaskB>().To<BootTaskB>().InSingletonScope();

kernel.Bind<IBootTask>().To<IBootTaskA>();
kernel.Bind<IBootTask>().To<IBootTaskB>();

Так что я могу сделать это:

public class Boot
{
     public Boot(IBootTask[] bootTasks)
     {
          foreach(var task in bootTasks){task.Execute();}
     }
}

но я не могу связать интерфейс с интерфейсом, кто-нибудь знает способ обойти это?

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Вот как вы это делаете.

public class Service : IServiceA, IServiceB {}

this.Bind<Service>().ToSelf().InSingletonScope();
kernel.BindInterfaceToBinding<IServiceA, Service>();
kernel.BindInterfaceToBinding<IServiceB, Service>();

Расширение объекта обрабатывает все, что вам нужно.

https://github.com/ninject/ninject.extensions.contextpreservation/wiki/Bind-Interface-to-Binding

РЕДАКТИРОВАТЬ:

В ninject 3 это немного проще, вам больше не нужно сохранение контекста, просто:

Bind<IServiceA,IServiceB>().To<Service>().InSingletonScope();
1 голос
/ 29 ноября 2011

ОБНОВЛЕНИЕ: Перегрузки V3 Bind решают многие из них.


Ninject не имеет каких-либо конструкций такого типа (и я не знаю о других контейнерах, имеющих такиелибо система).

Я подозреваю, что какая-то форма Условные привязки может быть наиболее подходящей для вашей реальной проблемы (я предполагаю, что у вас нет общих интерфейсов маркеров в точности так, как вы показываете).

Или вы просто пытаетесь найти конструкцию, которая сохранит ваши привязки сухими?Лично я выразил бы вышеизложенное как две привязки с пользовательским методом расширения .WithStandardTaskProperties, а не с 4 строками.

...