Podczas oglądania video o MVVM na Pluralsight nie było sytuacji, w której wzorzec MVVM został naruszony, ale nie prawidłowy sposób robi to zostało pokazane na rysunku:Wyświetlenie okna komunikatu z ViewModel stanowi naruszenie MVVM - jak uniknąć?
- Widok był przycisk, który używa ICommand do uruchomienia obsługi w ViewModel.
- Program obsługi poprawnie przekazał wykonanie do implementacji repozytorium.
- Konkretna implementacja repozytorium zwana metodą usługi internetowej.
Jednak: jeśli wywołanie usługi internetowej nie powiodło się, ViewModel wyświetliłby okno komunikatu, które informuje użytkownika o błędzie. Ponieważ ViewModel jest abstrakcją widoku, nie powinien bezpośrednio tworzyć interfejsu użytkownika, ale jaki jest w 100% czysty sposób, aby wyświetlić to okno komunikatu użytkownikowi?
wygląda prosto i ma sens. Ale jeśli zrobię ViewModel abstrakt przez nie implementację ShowMessageBox() i mam jedną implementację dla testów jednostkowych i jedną dla produktywnego użycia, skończyłbym z tym samym efektem bez zastrzyku zależności. Jakieś uwagi lub krytyka dotyczące takiego podejścia? – Krumelur
1) To narusza SRP. Tworzysz model widoku odpowiedzialny za wszystko. 2) Zamiast 2 wdrożeń serwisowych (jedna do produkcji, jedna do testowania), powinieneś zachować 2 implementacje każdego modelu widoku, co wymaga tej funkcjonalności. 3) Rozważmy to: 'SomeViewModel' musi wyświetlać pola komunikatów i ma abstrakcyjne' ShowMessageBox'; 'SomeDerivedViewModel: SomeViewModel' nie musi tego wyświetlać, ale już masz tę metodę. – Dennis