2012-02-06 18 views
14

Czy możliwe jest użycie ninject do wstrzykiwania zależności w taki sposób, aby wynik był podobny do wstrzyknięcia, które mogę uzyskać w MVC. Aby opracować, jeśli używam adaptera MVC ninject, mogę zadeklarować, że moje kontrolery sieci mają parametry konstruktora, które następnie byłyby automatycznie wstrzykiwane przez ninject.Injektor wtrysku konstruktora w WPF

Jednak nie znalazłem takiego ninject rozszerzenie dla WPF, który pozwoliłby mnie mieć okno takie jak to:

public partial class MainWindow : Window 
{ 
    private readonly IService injectedService; 
    public MainWindow(IService injectedService) 
    { 
     this.injectedService = injectedService; 
    } 
} 

chciałbym to zrobić bez jawnie przy użyciu IKernel w moim uruchomienie głównej aplikacji w celu uzyskania wystąpienia mainowindow. Zdecydowanie wolałbym korzystać z normalnej metody konfiguracji xaml, aby uzyskać wystąpienie okna głównego i wszystkich kolejnych okien.

Czy to możliwe? Czy istnieje sposób, aby podłączyć się do tworzenia obiektów generowanych przez xaml, aby zmodyfikować go, aby użyć Ninject do wstrzyknięcia zależności od konstruktora.

+2

Nie sądzę, że takie rozszerzenie istnieje, ponieważ w WPF zwykle używasz wzorca MVVM i w ten sposób wstrzykniesz usługi do twoich klas ViewModel. –

+0

Ale czy same modele nie są również tworzone za pomocą XAML? Wprawdzie nie jestem ekspertem od WPF, ale czy modele nie potrzebują tego samego rodzaju zastrzyku zależności? Obawiam się, że mój kontener pokazuje, co przeszkadzałoby w testowaniu jednostkowym projektu. – Dervall

+3

Nie, ViewModels nie są tworzone w XAML. Są one tworzone w ViewModelLocator, zobacz [tutaj] (http://windowsphonegeek.com/articles/Working-with-a-simple-ViewModelLocator- from - MVVM-Lite) na przykład. Twoje widoki lub ViewModels nie wiedzą nic o twoim kontenerze wtrysku zależności. –

Odpowiedz

17

Na podstawie komentarzy & Twoje zamieszanie wygląda na to, że MVVM dobrze Ci odpowiada. Wyzwaniem jest LEARNING MVVM.

Więc roztrzaskać się o good link i toczyć. MVVM jest zaskakująco łatwa do zrobienia, a dość łatwo można ją zawrzeć za pomocą Ninjecta i nałożyć na nią łuk.

Początkowa krzywa uczenia się, jeśli NIE używasz biblioteki 3rd party dla Ninject + MVVM, tak jak ja, jest nieco stroma. Więc oto kilka rzeczy musiałem zrozumieć:

 DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}" 

Ten mały dodatek sprawia pozwala wyzwalać ninject aby uzyskać viewmodel informacje z XAML:

<Application.Resources> 
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" /> 
</Application.Resources> 

ten mały trik pozwala na przypisanie to źródło statyczne z pliku app.xaml do odpowiedniej klasy

public class NinjectServiceLocator 
{ 
    private readonly IKernel kernel; 

    public NinjectServiceLocator() 
    { 
     kernel = new StandardKernel(new MyMvvmModule()); 
    } 

    public ResultViewModel ResultViewModel 
    { 
     get { return kernel.Get<ResultViewModel>(); } 
    } 
} 

To jest godne uwagi. Każdy model widoku musi być wymieniony jako właściwość w ServiceLocator, aby generator mógł je wygenerować. Wreszcie, MyMvvmModule w powyższym przykładzie jest standardową klasą Ninject, w której przyklejasz swoje zastąpienie dla Load() i bindujesz wszystkie swoje interfejsy.

+0

Dziękuję, bardzo pomocne – Dervall

+1

@Dervall Dzięki. Ten post jest tym, co moim zdaniem Jeff Atwood przewidział dla SO. Miałem podobny problem, więc podzieliłem się informacją, którą odkryłem po tym, jak szukałem jej przez wiele godzin, oszczędzając nikogo w przyszłości, wiele mam czasu. – deltree

Powiązane problemy