2009-07-20 16 views
12

Posiadam UserControl WPF, który chciałbym wprowadzić zależności. Jaki jest najlepszy sposób na zrobienie tego przy pomocy Ninject?Wstrzykiwanie zależności do WPF przy użyciu Ninject

Podjąć konkretny przykład: Posiadam UserControl o nazwie MapView i chcę wstawić do niego instancję mojej IDialogueService, za pośrednictwem konstruktora lub wtrysku właściwości. Obecnie nie używam żadnej iniekcji zależność, a moja kontrola jest tworzony w XAML:

<Window x:Class="GameWindow" ...> 
    <Grid Name="root"> 
     <MapView x:Name="mapView" ... /> 
     <!-- other stuff here --> 
    </Grid> 
</Window> 

Tworzenie IKernel i wiązania IDialogueService jest dosyć proste. Ale utknąłem na tym, jak używać jądra do wstrzykiwania zależności do mojego MapView. Wciąż jestem totalnym nowicjuszem w firmie Ninject, więc może jest coś oczywistego, czego mi brakuje.

mogę myśleć kilka sposobów, aby rozwiązać ten problem:

  1. instancję MapView w kodzie. Wyjąć <MapView ... /> z XAML, a zamiast dodać do konstruktora GameWindow za:

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

    Wady: dodatkowa złożoność od nieużywania XAML; GameWindow ma zależność od IKernel.

  2. Utrzymuj konkretyzacji w XAML i użyć zastrzyk nieruchomości Zamiast:

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

    Wada: docs Ninject że Inject() „nie powinien być stosowany w większości przypadków”, więc nawet nie wiem jeśli robi to, co myślę, że robi, lub czy ma sens używać go tutaj. A GameWindow nadal ma zależność od IKernel.

  3. Dodaj parametry/właściwości do wstrzykiwania do GameWindow, które przekazują wartości do MapView (prawdopodobnie za pośrednictwem właściwości MapView), a następnie użyj Get<GameWindow>(). Minus: teraz ręcznie przekazuję zależności w każdym miejscu, co jest dla mnie zautomatyzowane.

  4. Po utworzeniu GameWindow przejdź się po drzewie logicznym i wywołaj funkcję IKernel.Inject() we wszystkich elementach. Wady: znowu, nie wiem, czy Inject() robi to, co myślę, że robi, czy jest to odpowiednie tutaj. Po utworzeniu GameWindow, osoba dzwoniąca musi pamiętać o zrobieniu rzeczy typu "spacer-the-visual-tree-and-inject".

Czy jest lepszy sposób to zrobić? Być może rozszerzenie WPF dla Ninject, które pozwala mi wykonać Get<GameWindow>() i automatycznie przesuwa logiczne drzewo dla mnie (jak w # 4), wykonując wtrysk właściwości na wszystko? Jeśli coś takiego nie istnieje, czy mógłbym to napisać?

Jak się macie podejście do używania programu Ninject z WPF? Czy korzystasz z któregokolwiek z powyższych podejść (a jeśli tak, to czy możesz dzielić się/nie wiem o)? Czy masz lepsze podejście?

Odpowiedz

4

1) jest najlepszy. Znajdziesz także wygodny punkt dostępu do funkcji Mapview.

Ponadto, zamiast przekazywać jądro, po prostu rób jądro. Pobierz < GameWindow>() i [wstrzyknij] MapView w GameWindow.

+0

Wstrzyknięcie samej kontroli nigdy mi się nie przydarzyło, ale teraz wydaje się oczywiste. Dzięki! –

Powiązane problemy