Gute Architektur für die Verwendung eines REST-Webdiensts in einer MVVM-App für Windows Phone 7?

8

Ich habe ein paar Probleme mit der Entscheidung, wie ich die Daten vom Web-Service zur Benutzeroberfläche bringen kann.

Angesichts der asynchronen Natur von WebClient, wie würden Sie das erstellen?

  • Das Modell verwendet WebClient, um mit dem Webservice
  • zu kommunizieren
  • ViewModel fragt das Modell nach Daten
  • ab
  • View ist mit ViewModel
  • verbunden

Beim asynchronen Complete-Ereignis muss ich diese Daten aus dem Modell in das ViewModel zurückholen. Dies sind die Dinge, über die ich nachgedacht habe.

  1. Ich könnte ein Ereignis im Model auslösen, das das ViewModel abonniert hat.
  2. Ich könnte vielleicht etwas mit Callbacks umgehen?
  3. Oder sollte ich eine zweite Stufe von INotifyPropertyChanged-Ereignissen zwischen dem ViewModel und dem Model machen?
  4. Oder bin ich sehr verwirrt und verstehe MVVM völlig falsch?
Will 05.07.2010, 21:22
quelle

2 Antworten

4

Es hängt davon ab, wie puristisch Sie über MVVM sein wollen.

Sie könnten die API selbst als Ihr Modell behandeln. In diesem Fall hat das ViewModel den WebClient und bei der Ausführung von Async würden Sie Ihre Eigenschaften festlegen (und sie würden dann PropertyChanged innerhalb ihrer Setter auslösen).

Oder Sie können ein lokales Model haben, das den WebClient-Code enthält (so wie es klingt). In diesem Fall würde mein persönlicher Ansatz ein "ModelUpdated" -Ereignis haben, das vom asynchronen Complete-Ereignis ausgelöst wird. (Ihre Option 1).

Ihr ViewModel kann auf dieses Ereignis warten und entweder PropertyChanged(null) auslösen, damit die View nach ALL-Eigenschaften fragt, oder mehrere PropertyChanged-Ereignisse auslösen. Denken Sie daran, dass Sie nicht darauf beschränkt sind, PropertyChanged innerhalb Ihrer Setter auszulösen. Es gibt nichts, was Sie daran hindert, eine Methode wie

zu verwenden %Vor%

Sie können diese Methode also aufrufen, wenn das Modell vollständig gefüllt ist, und Ihre Benutzeroberfläche wird aufgerufen, wenn Sie jede Eigenschaft aktualisieren, wenn sie ausgelöst wird. Sie müssten dies nur tun, wenn Sie eine Menge Eigenschaften haben und nicht alle auf einmal mit PropertyChanged(null) abfeuern möchten.

    
Ben Gracewood 05.07.2010 23:34
quelle
1

Ich denke, Sie müssen eine neue Ebene in Ihre Architektur einführen; eine Serviceschicht. Normalerweise gebe ich meine relevanten Dienste an mein ViewModel weiter und das ViewModel erledigt die Bearbeitung der asynchronen Anrufe und zeigt belegte Zustände und all diese spaßigen Sachen an.

Wenn Sie beispielsweise ein Produktmodell und ProductListViewModel mit einer Sammlung von Produkten und möglicherweise einem Suchbefehl haben, würden Sie einen ProductSearchService (oder ProductLoadService, der alle Produkte lädt) einführen. Ich würde diesen ProductSearchService dann an Ihren ProductListViewModel-Konstruktor übergeben (Dependency-Injektion) und Ihr ViewModel steuern lassen, wie die Produkte (Ihre Modellobjekte) abgerufen werden, indem die entsprechenden Servicemethoden aufgerufen und die Antwort geladen werden.

  • ProductListService gibt die Produkt (-Modell) -Liste
  • zurück
  • ProductListViewModel verwendet ProductListService, um Produkte
  • zu erhalten
  • ProductListView bindet an ProductList ObservableCollection in ProductListViewModel.

Dieses Muster ähnelt im Wesentlichen dem Model-View-Controller, wobei das ViewModel mehr Controller-Verantwortlichkeiten übernimmt.

Da Sie REST-basierte Web-Services erwähnen, habe ich einen Beispiel-Blogeintrag, in dem MVC 2-JSON-Ergebnisse als Service-Layer für eine Win Phone 7-App verwendet werden: Datengesteuerte Win Phone 7 Apps mit MVC 2 JSON-Diensten

    
Jacob 20.07.2010 14:51
quelle