Jak mądry może być ViewModel? Rozplanowanie odpowiedzialności.

0

Moje własne implementacje MVVM są bardzo brzydkie (w dodatku nie używam Command, ani IoC i zjecie mnie żywcem), ale czasami warto rozplanować jednak aplikację w nieco bardziej sensowny sposób. Ale nie do końca wiem, kto za to powinien odpowiadać w pewnych sytuacjach.

  1. Mam aplikację, która co jakiś czas musi sobie zaktualizować widok, na podstawie prostego DispatcherTimera. ViewModel u mnie ma tego timera i aktualizuje swoją kolekcję, prosząc o to repozytorium. Dobrze? Czy też odwrotnie, repozytorium ma wymusić aktualizację ViewModelu?
  2. Ładuje się aplikacja i ma od razu pokazać ContentDialog, o ile została uruchomiona z odpowiednim parametrem. U mnie robi to widok - prosi ViewModel o dane, przekazuje do ContentPanelu, wyświetla. Tutaj powinienem sobie zrobić Messenger Pattern?
  3. Gdzieś w aplikacji coś się stało (przyszła wiadomość z zewnątrz) i musimy wyświetlić ContentDialog, do którego przekazujemy zupełnie nowy ViewModel. Jednocześnie "odbieracz" wiadomości z zewnątrz musi je ignorować, dopóki ContentDialog nie zostanie zamknięty. Znowu przekazywanie informacji pomiędzy warstwami, więc Messenger? Główny VM dostaje wiadomość, tworzy obiekt podrzędnego VM, wyświetla ContentDialog i przekazuje mu jego DataContext, czy jakoś inaczej?
  4. Dodatkowe utrudnienie: ContentDialog zwraca wynik. Główny VM odbiera wynik i przekazuje dalej.
  5. Dodatkowe utrudnienie do powyższego to oczywiście dostęp pomiędzy wątkami - obecnie mam globalny DispatcherHelper w aplikacji, z metodą RunOnUIThread() i brak pomysłu jak można by to zrobić bardziej sensownie.
  6. Nazewnictwo: w systemie istnieją urządzenia. Kontrolujemy pojawianie się nowych urządzeń i to, co one przesyłają do nas. Klasa, która to robi powinna nazywać się...? DeviceManager? Te Managery wszelkiej maści nie są zbyt pięknymi nazwami.
0
  1. Na pewno repozytorium ma nie wymuszać aktualizacji viewmodelu, repozytorium ma jasną odpowiedzialność i na pewno wpływ na działanie viewmodelu nie wchodzi w grę. Jak będziesz miał 20 viewmodeli i w każdym inną logikę co do pobierania danych to będziesz implementować w repozytorium 20 różnych możliwości?

  2. Dlaczego viewmodel nie przekazuje do widoku tego co chce aby zostało wyświetlone? Całą logikę powineneś zamknąć w viewmodelu i traktować widok jako element służący do prezentacji danych i przekazywania komend użytkownika. Zamykanie w nim jakiejkolwiek logiki utrudnia utrzymanie aplikacji. Jak napiszesz testy jednostkowe do logiki trzymanej w widoku?

Co do nieużywania IoC i command pattern - używanie ich jednak ułatwia pracę

1 użytkowników online, w tym zalogowanych: 0, gości: 1