2010-11-19 5 views
23

Meine Ansicht Modellklasse hat eine Methode (nicht sicher, ob das eine gute Übung ist oder ob Ansichtsmodelle streng die Mechanismen zum Ändern von Eigenschaften und Eigenschaften sein sollen), die sich mit einem Dienst verbinden. Natürlich möchte ich alle möglichen WCF-Ausnahmen beim Verbinden oder Trennen behandeln.Wo bekomme ich Ausnahmen in MVVM?

Verwenden wir den Endpunkt nicht als Beispiel, da dies eine Ausnahme ist, die ich dem Benutzer zeigen möchte. Betrachten Sie das grobe Codebeispiel:

public void Connect() 
{ 
    ServiceClient proxy = null; 
    try 
    { 
     proxy = new ServiceClient(); 
     proxy.Subscribe(); 
     // ... 
    } 
    catch(EndpointNotFoundException) 
    { 
     // should I do something here? 
    } 
    // .. other WCF related exception catches and a finally 
} 

Ist es als gute Praxis vielleicht berufen System.Windows.MessageBox.Show() direkt im Fang oder sollte ich vielleicht rethrow die Ausnahme so eine weitere Schicht aus meiner WPF-Anwendung fängt es ? Wenn ja, wo ist der ideale Ort, um eine solche Ausnahme zu bekommen?

+0

Was genau soll der Benutzer mit dieser Ausnahme machen? Sie sollten dem Benutzer alles sagen, was er benötigt, um diese Ausnahme korrekt zu behandeln. Wenn es nichts gibt, was der Benutzer dagegen tun kann, dann erzähle dem Benutzer keine Ausnahme, vielleicht "Sorry, aber etwas stimmt nicht". –

+1

@John, der Benutzer muss nicht die Welt retten. Ich muss dem Benutzer nur zeigen, dass das entfernte Ende nicht verfügbar ist. Deshalb erwähne ich eine MessageBox. Diese Frage betrifft nicht, was ich dem Benutzer sagen soll, ich möchte wissen, wie ich elegant mit Ausnahmen in dem Muster umgehen kann, das ich benutze. – jlafay

+0

Ich handhabe WCF-Fehler auf diese Weise: [MSDN] (http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx) – Gabe

Antwort

27

Ich habe Ausnahmen in meinem MVVM-Client behandelt, indem ich sie abfing und sie in eine ErrorViewModel Eigenschaft von was auch immer ViewModel die Ausnahme gefangen wickelte.

Angenommen, ein ViewModel A fängt die EndpointNotFoundException ab. Um diesen Fehler darzustellen, verpacke ich die Exception in ein ErrorViewModel und weise sie der A Fehlereigenschaft zu.

Die Ansicht im Zusammenhang mit A enthält eine ContentControl gebunden A ‚s Eigenschaft Fehler. In der Zwischenzeit verwende ich eine DataTemplate, um dem ErrorViewModel eine Fehleransicht zuzuordnen. In dieser Ansicht wird davon bestimmt, ob A 's Error -Eigenschaft eine Ausnahme enthält.

So A ‚s Ansicht enthält eine Fehlermeldung anzeigen, die nur angezeigt wird, wenn eine Ausnahme abgefangen wird, und kann durch den Benutzer zurückzuweisen (eine OK-Taste auf der Fehlermeldung anzeigen einen Befehl auf A ruft, das A 's Error-Eigenschaft löscht, wodurch die Sichtbarkeit der Fehlermeldungsansicht in Collapsed geändert wird).

Bis jetzt scheint dies ein guter Ansatz zu sein, der die richtige MVVM-Entkopplung beibehält.

Hoffe, dass hilft. So oder so, ehrlich, ich würde System.Windows.MessageBox.Show() in einer WPF App als eine rein letzte Möglichkeit betrachten. Warum geben Sie die Kontrolle über die Benutzeroberfläche zugunsten dieser alten Sache auf? Apropos, hier ist another popup-implementation approach.

+0

Ich dachte, eine MessageBox wäre der letzte Ausweg (und hoffe heimlich). – jlafay

+2

Ich mag diesen Ansatz; Es ist die Aufgabe des ViewModels, einen Zustand darzustellen, der visualisiert werden kann. Daher sollte ein Fehler, der irgendwo im Modell aufgetreten ist, niemals in die Ansicht verschoben werden. Stattdessen sollte der Status des ViewModel widerspiegeln, dass ein Fehler aufgetreten ist. Ich könnte auch sehen, dass der Fehler bis zu einem ErrorDisplayService weitergegeben wird, mit einem zentralisierten Mechanismus zum Aufdecken von Fehlerzuständen aus verschiedenen Quellen. –

+0

Ich mag das sehr. Wenn ich Sie verstehe, würden Sie jede Ausnahme abstrahieren, die bedeutet "Ich kann das andere Ende nicht erreichen" in einen Fehler, der dem Benutzer angezeigt wird. Das ist perfekt. Wenn dies eine API gewesen wäre, hätte ich vorgeschlagen, solche Ausnahmen in eine andere einzufügen, die besagt: "Kann das andere Ende nicht erreichen". –

Verwandte Themen