2009-07-20 2 views
12

У меня есть 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, так что, возможно, есть что-то очевидное, что я пропал без вести.

Я могу придумать несколько способов решить эту:

  1. Инстанцировать в MapView в коде. Удалите <MapView ... /> из XAML, и вместо того, чтобы добавить это к конструктору GameWindow в:

    public GameWindow(IKernel kernel) { 
        root.Children.Add(kernel.Get<MapView>()); 
    } 
    

    Downsides: дополнительная сложность с не использованием XAML; GameWindow имеет зависимость от IKernel.

  2. Держите экземпляр в XAML и использовать инъекции свойства вместо:

    public GameWindow(IKernel kernel) { 
        kernel.Inject(mapView); 
    } 
    

    Даунсайд: Ninject документы говорят, что Inject() «не должен использоваться в большинстве случаев», так что я даже не знаю, если он делает то, что я думаю, что он делает, или имеет смысл использовать его здесь. И GameWindow все еще имеет зависимость от IKernel.

  3. Добавить параметры/свойства для инъекций в GameWindow, которые передают значения в MapView (возможно, через свойства MapView), а затем используют Get<GameWindow>(). Даунсайд: теперь я вручную передаю зависимости по всему месту, и я полагаю, что для меня автоматизирована инфраструктура DI.

  4. После создания экземпляра GameWindow пройдите по логическому дереву и вызовите IKernel.Inject() на все. Недостатки: опять же, я не знаю, делает ли Inject() то, что я думаю, что он делает, или он уместен здесь. Вызывающий должен помнить, что после создания GameWindow делайте прогулку с визуальным деревом и впрыском.

Есть ли лучший способ сделать это? Возможно, расширение WPF для Ninject, которое позволяет мне делать Get<GameWindow>(), и автоматически выполняет логическое дерево для меня (как в # 4), делая инъекцию свойств во всем? Если такой вещи не существует, можно ли мне написать ее?

Как вы, ребята, используете Ninject с WPF? Используете ли вы какой-либо из вышеперечисленных подходов (и если да, можете ли вы поделиться вверх/вниз, о которых я не знаю)? У вас есть лучшие подходы?

ответ

4

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

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

+0

Внедрение самого элемента управления мне даже не пришло в голову, но теперь это кажется очевидным. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^