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:
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.
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.
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.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?
Wstrzyknięcie samej kontroli nigdy mi się nie przydarzyło, ale teraz wydaje się oczywiste. Dzięki! –