Подтвердить что ты не робот

Включение зависимостей в WPF с использованием Ninject

У меня есть 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? Используете ли вы какой-либо из вышеперечисленных подходов (и если да, можете ли вы поделиться вверх/вниз, о которых я не знаю)? У вас есть лучшие подходы?

4b9b3361

Ответ 1

1). Вы также найдете удобную точку входа для функций Mapview.

Кроме того, вместо того, чтобы передавать в ядре, просто выполните kernel.Get <GameWindow> () и [inject] MapView в GameWindow.