Я пробую Ninject с приложением winforms (в основном, эскиз, я использую его как ката, но ничего более строгого или конкретного) в .net 4.
Чтобы создать основную форму, я делаю что-то вроде:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
[...]
IKernel kernel = BuildKernel();
Application.Run(kernel.Get<frmMain>());
}
static IKernel BuildKernel()
{
var modules = new INinjectModule[]
{
[..modules]
};
return new StandardKernel(modules);
}
}
Fine. Это создает основную форму и хорошо отображает ее, передавая соответствующие реализации интерфейса инжектированному конструктору.
И что теперь? Мое приложение является MDI и будет иметь несколько дочерних окон для манипулирования моделью приложения. У меня больше нет ссылки на ядро, так как я могу Get()
эти формы? Я предполагаю, что очевидный ответ - «передать ядро в форму», но это ужасно грязная стратегия, и я уверен, что она не вписывается в философию DI.
Здесь я укажу, что документация для Ninject 2 отстой . Все, что я могу найти, повторяет основные примеры, без реального объяснения того, как DI, использующий Ninject, облегчает задачу. Стандарт приведенного примера не достаточно сложен, чтобы оправдать необходимость кодирования и создания модулей и привязок.
edit # 1:
Изучив ссылки, любезно предоставленные Сэм Холдер , я пробую подход «составной корень». Моя архитектура теперь заставляет все формы, которые она использует, получить из CompositedForm
с семантикой конструктора, таким образом:
[Inject]
public CompositingForm(ICompositionRoot CompositionRoot)
{
InitializeComponent();
this.CompositionRoot = CompositionRoot;
}
public readonly ICompositionRoot CompositionRoot;
public CompositingForm() : this(new DummyCompositionRoot()) { }
Второй конструктор предназначен для дизайнера форм, который глуп и не может понять разметку формы, если вы не предоставите пустой конструктор. Теперь каждая форма, созданная с использованием IKernel.Get<AForm>()
, будет (должна) иметь корень композиции, вставленный в нее.
Итак, поскольку я медленный ученик - теперь вопрос действительно «Что должно идти в этом корне композиции»?