2012-08-31 8 views
8

Was ist der richtige Weg, um Messenger Klasse zu verwenden? Ich weiß, dass es für ViewModels/Views-Kommunikationen verwendet werden kann, aber ist es ein guter Ansatz, es für eine technische/Business-Service-Ebene zu verwenden?Richtige Art der Verwendung von MVVM Light Messenger

Beispielsweise registriert sich ein Protokollierungs-/Navigationsdienst für einige Nachrichten in den Konstruktoren und erkennt, wenn diese Nachrichten in der App auftreten. Der Absender (ViewModel ou Service) verweist nicht auf die Serviceschnittstelle, sondern nur auf den Messenger zum Senden von Nachrichten. Hier ist ein Beispiel-Service:

+0

Für weitere Lektüre: [Globale Ereignisse als schädlich angesehen] (http://dkturner.blogspot.hu/2010/06/global-events-consided-harmful.html) – nemesv

+0

Danke, scheint ein schlechter Ansatz zu sein. aber es ist nicht spezifisch für MVVM Messenger – Cybermaxs

Antwort

23

Für mich ist die Hauptverwendung eines Boten, weil es die Kommunikation zwischen ViewModels ermöglicht. Nehmen wir an, Sie haben ein Viewmodel, das verwendet wird, um Business-Logik zu einer Suchfunktion und 3 Viewmodels auf Ihrer Seite/Fenster, die die Suche verarbeiten möchten, um Ausgabe anzuzeigen, der Messenger wäre der ideale Weg, dies lose zu tun Weg.

Das Ansichtsmodell, das die Suchdaten erhält, würde einfach eine "Such" -Nachricht senden, die von allem konsumiert würde, das zur Zeit zum Aufzeichnen der Nachricht registriert war.

Die Vorteile sind hier:

  1. einfache Kommunikation zwischen Viewmodel ohne jedes Ansichtsmodell umeinander
  2. kennen ich die Produzenten auslagern kann, ohne einen Verbraucher zu beeinflussen.
  3. Ich kann mehr Nachrichtenkonsumenten mit wenig Aufwand hinzufügen.
  4. Es hält die Viewmodels einfach

Edit: Also, was über Dienstleistungen?

In ViewModels dreht sich alles darum, wie Daten auf der Benutzeroberfläche angezeigt werden. Sie nehmen Ihre Daten und formen sie zu etwas, das Ihrem View präsentiert werden kann. ViewModels erhalten ihre Daten von Diensten.

Ein Service stellt dem ViewModel die Daten und/oder Geschäftslogik zur Verfügung. Der Service-Job dient dazu, Business Model-Anforderungen zu bedienen. Wenn ein Dienst andere Dienste kommunizieren/verwenden muss, um seine Aufgabe zu erfüllen, sollten diese mithilfe von Dependency Injection in den Dienst eingefügt werden. Dienste würden normalerweise nicht mit einem Messenger kommunizieren. Beim Messenger geht es um horizontale Kommunikation auf Viewmodel-Ebene.

Eine Sache, die ich gesehen habe, ist, einen Messenger als mediator zu verwenden, wo anstatt den Dienst direkt in ein Ansichtsmodell zu injizieren, der Messenger stattdessen in das Viewmodel injiziert wird. Das Ansichtsmodell abonniert ein Ereignis und empfängt Ereignisse, die Modelle aus dem Ereignis enthalten. Dies ist ideal, wenn Sie regelmäßig Aktualisierungen erhalten oder Updates von mehreren Diensten erhalten, die Sie zu einem einzigen Stream zusammenführen möchten.

Einen Messenger zu verwenden, anstatt einen Dienst zu injizieren, wenn Sie Requests/Response-Anfragen machen, macht keinen Sinn, da Sie mehr Code schreiben müssen, um dies zu tun, den Sie schreiben müssten Service direkt und es macht den Code schwer zu lesen.

Blick auf Ihren Code, oben. Stellen Sie sich vor, Sie müssten für jede Methode ein Ereignis schreiben (Navigate, CanNavigate, GoBack, GoForward usw.). Sie würden mit einer Menge Nachrichten enden. Ihr Code wäre auch schwerer zu folgen.

+0

danke, aber was ist mit Dienstleistungen? – Cybermaxs

+0

Raten Sie, dass der Kerl Ihre Antwort abgezockt hat? http://www.codeproject.com/Tips/696340/Thinking-in-MVVMLight-Messenger –

Verwandte Themen