У меня есть UserFontrol WPF, в который я хотел бы добавить зависимости. Каков наилучший способ сделать это с помощью Ninject?Вводные зависимости в 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>()); }
Downsides: дополнительная сложность с не использованием XAML; GameWindow имеет зависимость от IKernel.
Держите экземпляр в XAML и использовать инъекции свойства вместо:
public GameWindow(IKernel kernel) { kernel.Inject(mapView); }
Даунсайд: Ninject документы говорят, что Inject() «не должен использоваться в большинстве случаев», так что я даже не знаю, если он делает то, что я думаю, что он делает, или имеет смысл использовать его здесь. И GameWindow все еще имеет зависимость от IKernel.
Добавить параметры/свойства для инъекций в GameWindow, которые передают значения в MapView (возможно, через свойства MapView), а затем используют
Get<GameWindow>()
. Даунсайд: теперь я вручную передаю зависимости по всему месту, и я полагаю, что для меня автоматизирована инфраструктура DI.После создания экземпляра GameWindow пройдите по логическому дереву и вызовите IKernel.Inject() на все. Недостатки: опять же, я не знаю, делает ли Inject() то, что я думаю, что он делает, или он уместен здесь. Вызывающий должен помнить, что после создания GameWindow делайте прогулку с визуальным деревом и впрыском.
Есть ли лучший способ сделать это? Возможно, расширение WPF для Ninject, которое позволяет мне делать Get<GameWindow>()
, и автоматически выполняет логическое дерево для меня (как в # 4), делая инъекцию свойств во всем? Если такой вещи не существует, можно ли мне написать ее?
Как вы, ребята, используете Ninject с WPF? Используете ли вы какой-либо из вышеперечисленных подходов (и если да, можете ли вы поделиться вверх/вниз, о которых я не знаю)? У вас есть лучшие подходы?
Внедрение самого элемента управления мне даже не пришло в голову, но теперь это кажется очевидным. Благодаря! –