2013-06-01 18 views
7

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?

Odpowiedz

9

Utwórz usługę:

interface IDialogService 
{ 
    void ShowMessageBox(string message); 
} 

Wdrożenie go:

class DialogService : IDialogService 
{ 
    public void ShowMessageBox(string message) 
    { 
     MessageBox.Show(); // ... 
    } 
} 

wykorzystują wtrysk Zależność:

class ViewModel 
{ 
    [Import] // This is MEF-specific sample 
    private readonly IDialogService dialogService; 
} 
lokalizacja

lub usługa:

class ViewModel 
{ 
    private AnyCommandExecute() 
    { 
     // This is MEF-specific sample 
     var dialogService = container.GetExportedValue<IDialogService>(); 
    } 
} 

w celu uzyskania konkretnego modelu IDialogService, a następnie wywołaj uzyskaną implementację z ViewModel.

To samo podejście dotyczy wszystkich innych podobnych przypadków: pokaż okno dialogowe otwierania/zapisywania, pokaż swój niestandardowy model widoku w oknie dialogowym.

+0

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

+0

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

5

Istnieje kilka sposobów na to, że przylegają do wzorca MVVM, takich jak Interakcje usługi i Interaction Zamówienie zrobić.

usługi Interakcje

... usługi, które mogą być wykorzystywane przez model widok inicjowanie interakcji z użytkownikiem , tym samym zachowując swoją niezależność od widoku za realizacji

enter image description here

Żądanie dotyczące interakcji

... wykorzystuje zdarzenia wywoływane przez model widoku, aby wyrazić zamiar interakcji użytkownika z wraz z komponentami w widoku, które są powiązane z tymi zdarzeniami i które zarządzają wizualnymi aspektami interakcji .

enter image description here

Źródło

Oba cytaty powyżej pochodzą z tego źródła (która zawiera również bardziej szczegółowe informacje na temat wzorców): http://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec10

Powiązane problemy