У меня есть UserControl WPF, в который я хотел бы добавить зависимости. Какой лучший способ сделать это с помощью Ninject?
Чтобы взять конкретный пример: у меня есть UserControl, называемый MapView, и я хочу добавить в него экземпляр моего IDialogueService через конструктор или вложение свойств. В настоящее время я не использую никакой инъекции зависимостей, и мой контроль создан в XAML:
<Window x:Class="GameWindow" ...>
<Grid Name="root">
<MapView x:Name="mapView" ... />
<!-- other stuff here -->
</Grid>
</Window>
Создание IKernel и привязка IDialogueService достаточно просты. Но я зациклился на том, как использовать ядро для ввода зависимостей в свой MapView. Я все еще новичок в Ninject, поэтому, возможно, там что-то очевидное, что мне не хватает.
Я могу придумать несколько способов решить эту проблему:
-
Создайте экземпляр MapView в коде. Удалите
<MapView ... />
из XAML и вместо этого добавьте это в конструктор GameWindow:public GameWindow(IKernel kernel) { root.Children.Add(kernel.Get<MapView>()); }
Недостатки: дополнительная сложность от использования XAML; GameWindow имеет зависимость от IKernel.
-
Сохраните экземпляр в XAML и вместо этого используйте инъекцию свойств:
public GameWindow(IKernel kernel) { kernel.Inject(mapView); }
Даунсайд: Ninject docs говорят, что Inject() "не следует использовать для большинства случаев", поэтому я даже не знаю, делает ли он то, что я думаю, или имеет смысл использовать его здесь. И GameWindow все еще имеет зависимость от IKernel.
-
Добавьте параметры/свойства для инъекций в GameWindow, которые передают значения вместе с MapView (возможно, через свойства MapView), а затем используйте
Get<GameWindow>()
. Даунсайд: теперь я вручную передаю зависимости по всему месту, и я полагаю, что каркас DI будет автоматизировать для меня. -
После создания экземпляра GameWindow пройдите по логическому дереву и вызовите IKernel.Inject() на все. Недостатки: опять же, я не знаю, делает ли Inject() то, что я думаю, что он делает, или он подходит здесь. Вызывающий должен помнить, что после создания экземпляра GameWindow делайте визуально-визуальное дерево-и-инъекцию.
Есть ли лучший способ сделать это? Возможно, расширение WPF для Ninject, которое позволяет мне делать Get<GameWindow>()
, и автоматически выполняет логическое дерево для меня (как в # 4), делая инъекцию свойств во всем? Если такой вещи не существует, можно ли мне написать ее?
Как вы, ребята, используете Ninject с WPF? Используете ли вы какой-либо из вышеперечисленных подходов (и если да, можете ли вы поделиться вверх/вниз, о которых я не знаю)? У вас есть лучшие подходы?