Gibt es einen Unterschied zwischen dem Standardmuster "Model-View-Controller" und dem Model/View/ViewModel-Muster von Microsoft?
Wow... also stammen sowohl MVC als auch MVVM von SmallTalk? Sie waren anscheinend ihrer Zeit weit voraus...
Gibt es einen Unterschied zwischen dem Standardmuster "Model-View-Controller" und dem Model/View/ViewModel-Muster von Microsoft?
Das Viewmodel ist ein "abstraktes" Modell für die Elemente Ihrer Benutzeroberfläche. Es muss es Ihnen ermöglichen, die Befehle und Aktionen in Ihrer Ansicht auf nicht-visuelle Weise auszuführen (z. B. um sie zu testen).
Wenn Sie mit MVC gearbeitet haben, haben Sie es wahrscheinlich schon einmal als nützlich empfunden, Modellobjekte zu erstellen, die den Zustand Ihrer Ansicht widerspiegeln, z. B. um einen Bearbeitungsdialog ein- und auszublenden usw. In diesem Fall verwenden Sie ein Viewmodel.
Das MVVM-Muster ist einfach die Verallgemeinerung dieser Praxis auf alle UI-Elemente.
Und es ist nicht ein Microsoft-Muster, was hinzukommt ist, dass WPF / Silverlight Daten-Bindungen sind besonders gut geeignet, um mit diesem Muster zu arbeiten. Aber nichts hindert Sie daran, es mit Java Server Faces, zum Beispiel zu verwenden.
Es erstaunt mich, dass dies eine hochrangige Antwort ist, ohne dass man die Herkunft von MVVM. MVVM ist ein beliebter Begriff in der Microsoft-Community und wird entstanden ist. aus dem Buch von Martin Fowler Präsentation Modell . Um also das Motiv des Musters und die Unterschiede zu anderen Mustern zu verstehen, sollte man zunächst den Originalartikel über das Muster lesen.
Wow... also stammen sowohl MVC als auch MVVM von SmallTalk? Sie waren anscheinend ihrer Zeit weit voraus...
Die Behauptung, es stamme aus dem Präsentationsmodell von Martin Fowler, ist nicht ganz richtig. Es ist sehr schwierig zu bestimmen, was zuerst da war, aber beide Muster (wenn man davon ausgeht, dass es sich wirklich um das gleiche Muster handelt) wurden unabhängig voneinander und ungefähr zur gleichen Zeit entwickelt.
In diesem Modell gibt es keine HTTP-Ebene mehr Kontakt mit den Anfrage- oder Antwortobjekten, da die MVC-Maschine von MSFT sie vor uns verbirgt.
Zur Erläuterung von Punkt 6 oben (auf Anfrage)...
Nehmen Sie ein ViewModel wie dieses an:
public class myViewModel{
public string SelectedValue {get;set;}
public void Post(){
//due to MVC model binding the SelectedValue string above will be set by MVC model binding on post back.
//this allows you to do something with it.
DoSomeThingWith(SelectedValue);
SelectedValue = "Thanks for update!";
}
}
Die Controller-Methode des Posts sieht dann so aus (siehe unten). Beachten Sie, dass die Instanz von mvm automatisch durch die MVC-Bindungsmechanismen instanziiert wird. Sie müssen nie auf die Abfrage-String-Schicht als Ergebnis fallen! MVC instanziert das ViewModel für Sie auf der Grundlage der Query Strings!
[HTTPPOST]
public ActionResult MyPostBackMethod (myViewModel mvm){
if (ModelState.IsValid)
{
// Immediately call the only method needed in VM...
mvm.Post()
}
return View(mvm);
}
Beachten Sie, dass für diese actionmethod oben zu arbeiten, wie Sie beabsichtigen, müssen Sie eine null CTOR definiert, die Dinge nicht in der Post zurückgegeben intialisiert. Der Postback muss auch Name/Wert-Paare für die Dinge zurückgeben, die sich geändert haben. Wenn Name/Wert-Paare fehlen, tut die MVC-Bindungs-Engine das Richtige, nämlich einfach nichts! Wenn das passiert, werden Sie sich vielleicht sagen: "Ich verliere Daten bei Post Backs"...
Der Vorteil dieses Musters besteht darin, dass das ViewModel die gesamte "unübersichtliche" Arbeit mit der Model-/Business-Logik übernimmt, der Controller ist lediglich eine Art Router. Es ist SOC in Aktion.
Können Sie Punkt 6 erläutern? Mir ist klar, dass Sie nur ASP.Net abdecken, aber es scheint, dass eine unerwünschte Abhängigkeit zum ViewModel hinzugefügt wird. (z.B. das Wissen, woher die Daten kommen und wohin sie gehen). Ein Codebeispiel (Pseudocode?) wäre gut, um diese Antwort zu verdeutlichen und zu zeigen, welche Teile serverseitig und welche clientseitig sind.
Soweit ich das beurteilen kann, entspricht MVVM dem MV von MVC - was bedeutet, dass in einem traditionellen MVC-Muster das V nicht direkt mit dem M kommuniziert. In der zweiten Version von MVC gibt es eine direkte Verbindung zwischen M und V. MVVM scheint alle Aufgaben zu übernehmen, die mit der Kommunikation zwischen M und V zusammenhängen, und sie von der C zu entkoppeln. Dies ist die Rolle des Controllers. Durch das Entfernen dieser untergeordneten Aspekte aus den Controllern sind diese sauberer und es ist einfacher, das Anwendungsszenario und die Geschäftslogik der Anwendung zu ändern, was auch die Wiederverwendbarkeit der Controller erhöht.
IMHO würde ich argumentieren, dass "Controller wiederverwendbarer machen" eine zu weit gefasste Aussage ist und für allgemeine ASP.Net-"Controller" (d.h. nicht die Geschäftslogikschicht) kontraproduktiv ist, da diese Controller normalerweise die Teile der Anwendung enthalten, die anwendungsspezifisch . Es sind die Views, Models, ViewModels und die Geschäftslogik, die wiederverwendbar sein müssen. Ich hätte gedacht, dass die Behandlung der Geschäftslogik-Module als Dienstanbieter und nicht als Controller eine bessere Option wäre.
MVVM fügt das Ansichtsmodell in den Mix ein. Dies ist wichtig, da es Ihnen erlaubt, eine Menge von der Bindung Ansatz von WPF zu verwenden, ohne dass alle, die UI-spezifische Stücke in Ihrem regulären Modell setzen.
Ich kann mich irren, aber ich bin nicht sicher, ob MVVM wirklich den Controller in den Mix zwingt. Ich finde das Konzept mehr im Einklang mit sein: http://martinfowler.com/eaaDev/PresentationModel.html . Ich denke, dass die Menschen wählen, um es mit MVC zu kombinieren, nicht, dass es in das Muster eingebaut ist.
MVVM ist streng genommen ein Präsentationsmodell, obwohl MVVM die bevorzugte Bezeichnung für die WPF-spezifische Umsetzung des Musters ist.
Einverstanden. Das Viewmodel in MVC "IST" der Zustandsautomat für die Ansicht. Es enthält den Datentext und verfolgt alle Informationen zum ausgewählten Element und kann die gesamte Validierungslogik über die Schnittstelle IValidatableObject enthalten. Das ViewModel hat Schnittstellen zur DB in der Modellschicht, die stark typisierte Modelle verwenden kann. MVVM in WPF IST der Controller von MVC. Aber der Controller von MVC ist viel sauberer, er ist im Wesentlichen ein Routing-Handler.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
78 Stimmen
Beachten Sie, dass MVVM zwar von Microsoft geprägt wurde, aber auch viele Entwickler und Projekte außerhalb von Microsoft begonnen haben, dieses Muster zu übernehmen. Dieser Kommentar wurde Ihnen von der Abteilung "spite-the-MS-haters" zur Verfügung gestellt.
3 Stimmen
Nachdem ich lange Zeit mit MVVM gearbeitet habe, war meine erste Begegnung mit MVC frustrierend, bis ich lernte, dass ich ViewModels mit Hilfe von Bindungstechniken, die in MVVM zu finden sind, hin und her an den Browser übergeben kann. Aber wie Joel oben sagte, ist der einzige Weg, um den Zustand vom Browser zurückzubekommen, das Posten der Änderungen in einem Formular (das Name/Wert-Paare verwendet). Wenn Sie diesen Punkt nicht gut verstehen. Sie werden eine harte Zeit in MVC haben. Betrachten Sie den Controller einfach als einen Dependency Injector für die View und Sie sind bereit.
6 Stimmen
Eine solche Frage zu hochrangigen [Entwurfsmustern]. Ich würde gerne die Verwendung von Diagrammen in den Antworten vorschlagen.
1 Stimmen
Außerdem wurde die Frage umformuliert, um der Tatsache Rechnung zu tragen, dass die Frage im Zusammenhang mit Microsoft-Technologien gestellt wird... obwohl die akzeptierte Antwort irgendwie nicht stimmt.
5 Stimmen
Hier ist eine archivierte Version von Joels Artikel: web.archive.org/web/20150219153055/http://joel.inpointform.net/
4 Stimmen
Anders als bei der MVC-Methode ist das ViewModel kein Controller. Stattdessen fungiert es als Binder, der Daten zwischen View und Model bindet. Während das MVC-Format speziell darauf ausgelegt ist, eine Trennung von Modell und Ansicht zu schaffen, ist das MVVM-Format mit Datenbindung speziell darauf ausgelegt, dass Ansicht und Modell direkt miteinander kommunizieren können. hackernoon.com/