Winbot (MVVM Light + Ninject)

W tym tygodniu postanowiłem popracować trochę nad interfejsem użytkownika programu Winbot. Jeszcze dużo pracy przede mną, ale wydaje mi się, że podstawowe fundamenty są już gotowe. Projekt korzysta z framework’a WPF. Przeanalizowałem różne dostępne podejścia związane z rozwijaniem aplikacji w tej technologii. Najbardziej przekonała mnie architektura Model-View-ViewModel i oparta na niej biblioteka MVVM Light. Mimo że MVVM Light, do zarządzania zależnościami zachodzącymi pomiędzy obiektami (Inversion of control), dostarcza własne rozwiązanie (SimpleIoc),  postanowiłem je zastąpić moim ulubionym Ninject’em.

Przygotowanie środowiska jest dość trywialne. Zaczynamy od instalacji obu bibliotek za pomocą Nuget’a.

Po zainstalowaniu MVVM Light’a powinniśmy zauważyć następujące zmiany jakie zaszły w naszym projekcie:

  • Utworzenie folderu ViewModel zawierającego:
    • MainViewModel (ViewModel dla głównego okna MainWindow)
    • ViewModelLocator (punkt dostępowy do wszystkich ViewModeli)
  • Plik app.xaml zostanie zaktualizowany. Będzie wyglądał mniej więcej tak:

Domyślna implementacja ViewModelLocator’a korzysta z obiektu SimpleIoc. Ja chcę wykorzystać Ninject’a, dlatego też będzie trzeba wprowadzić pewne modyfikacje. Zacznijmy od stworzenia klasy inicjującej kontener. Nazwałem ją NinjectBootstrapper.

Klasy DesktopAppModule i ViewModelModule to moduły Ninject’a inicjalizujące nasz kontener. Ninject daje nam bardzo dużo możliwości konfiguracji modułów. Na początek warto jednak zacząć od czegoś prostego. Poniżej znajduje się prosty przykład takiego modułu.

Teraz jesteśmy gotowi żeby zaktualizować klasę ViewModelLocator.

Gotowe! Dzięki temu prostemu rozwiązaniu jesteśmy w stanie korzystać z możliwości jakie daje nam MVVM Light oraz Ninject. Mam nadzieję, że to znacznie ułatwi proces rozwijania mojej aplikacji i już w kolejnym poście będę mógł pochwalić się bardziej efektywnymi zmianami z punktu widzenia użytkownika.

Dodaj komentarz

Twój adres email nie będzie opublikowany. Pola wymagane zostały oznaczone *