2010-08-30 10 views
7

Ich plane zum ersten Mal eine WPF-App nach dem MVVM-Muster zu schreiben, aber etwas ist mir nicht ganz klar. Nehmen wir an, dass die Ansicht eine "Speichern" -Schaltfläche hat und wenn diese getroffen wird, muss ich den aktuellen Zustand meiner Daten (das Modell) speichern. Dies wird durch Senden einer SOAP-Nachricht an einen SOAP-Dienst erfolgen.WPF MVVM Dienstschicht

Wo in meinem MVVM-Setup leben diese SOAP Request/Response-Handler? Verursacht das View-Modell den SOAP-Aufruf selbst, wenn die Schaltfläche zum Speichern gedrückt wird? Sollte das Ansichtsmodell dem Modell mitteilen, dass es sich stattdessen selbst speichert? Vielleicht ist es ein anderer Weg, völlig getrennt von der MVVM?

Mein Gedanke war, dass (zumindest in diesem speziellen Fall) das View-Modell damit umgehen würde, da es die Schaltfläche zum Speichern in der Ansicht deaktivieren muss, bis die aktuelle Speicheranforderung abgeschlossen ist.

+0

Ich fing an, eine Antwort zu schreiben, und redete mich dann davon aus, und stattdessen +1. Mein Instinkt ist, dass das Model damit umgehen sollte, da die meisten ViewModels einen DataContext des Modells verwenden, aber das aktualisiert das Model selbst nicht, sondern etwas außerhalb dieses Modells ... –

Antwort

5

Ich habe normalerweise eine logische clientseitige Anwendungs-/Business-Schicht zwischen dem Viewmodel und der SOAP/WCF/Webservice-Schicht eingefügt. Auf dieser Ebene befinden sich alle Geschäftslogik- und Verarbeitungslogik ohne View. Denken Sie daran, dass das Ansichtsmodell das Modell der Ansicht und nicht das Modell der Domäne ist. Daher möchten Sie die Steuerung so schnell wie möglich an die nächste Ebene übergeben.

In diesem Szenario würde ich die Ansicht einen Speicherbefehl auf dem Viewmodel auslösen, die wiederum in die Anwendungsschicht aufrufen würde, die wiederum Anrufe an Remote-Dienste tätigen würde.

4

Das ViewModel sollte einen solchen Vorgang nicht ausführen. Es sollte nur auslösen. Daher muss das Modell es tun (oder eine andere Zwischenschicht, die für die Lade- und Speicheroperationen verantwortlich ist, nicht aber das ViewModel selbst).

Das ViewModel kann die Sicherungsoperation beobachten und Statusinformationen über den Fortschritt für die Ansicht bereitstellen.

0

Ich würde einen Service-Handler erstellen, auf den das ViewModel zugreifen kann. Übergeben Sie das in den Konstruktor des Viewmodels, und rufen Sie die Methoden auf, die vom Servicehandler verfügbar gemacht wurden.