Ответ 1
1). Вы также найдете удобную точку входа для функций Mapview.
Кроме того, вместо того, чтобы передавать в ядре, просто выполните kernel.Get <GameWindow> () и [inject] MapView в GameWindow.
У меня есть 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? Используете ли вы какой-либо из вышеперечисленных подходов (и если да, можете ли вы поделиться вверх/вниз, о которых я не знаю)? У вас есть лучшие подходы?
1). Вы также найдете удобную точку входа для функций Mapview.
Кроме того, вместо того, чтобы передавать в ядре, просто выполните kernel.Get <GameWindow> () и [inject] MapView в GameWindow.