MVC/MVVM ist kein entweder/oder Wahl.
Die beiden Muster tauchen in unterschiedlicher Weise sowohl in der ASP.Net- als auch in der Silverlight/WPF-Entwicklung auf.
Für ASP.Net wird MVVM verwendet, um wechselseitige Bindung Daten innerhalb von Ansichten. Dies ist in der Regel eine clientseitige Implementierung (z. B. mit Knockout.js). MVC hingegen ist eine Methode zur Trennung von Anliegen auf der Server-Seite .
Für Silverlight und WPF ist das MVVM-Muster umfassender und kann erscheinen als Ersatz für MVC (oder andere Muster der Organisation von Software in getrennten Verantwortungsbereichen) zu fungieren. Eine Annahme, die häufig aus diesem Muster hervorging, war, dass die ViewModel
einfach den Controller in MVC
(als ob man das einfach ersetzen könnte durch VM
para C
in das Akronym und alles wäre vergeben)...
Das ViewModel macht no ersetzen nicht notwendigerweise den Bedarf an separaten Controllern.
Das Problem ist, dass ein View-Modell, um unabhängig testbar* und vor allem wiederverwendbar zu sein, wenn es gebraucht wird, keine Ahnung hat, welcher View es anzeigt, aber was noch wichtiger ist keine Ahnung, woher die Daten stammen .
*Hinweis: In der Praxis entfernen Controller den größten Teil der Logik, die Unit-Tests erfordert, aus dem ViewModel. Die VM wird dann zu einem stummen Container, der wenig, wenn überhaupt, Tests erfordert. Dies ist eine gute Sache, da die VM nur eine Brücke zwischen dem Designer und dem Programmierer ist und daher einfach gehalten werden sollte.
Selbst in MVVM enthalten Controller in der Regel die gesamte Verarbeitungslogik und entscheiden, welche Daten in welchen Ansichten unter Verwendung welcher Ansichtsmodelle angezeigt werden sollen.
Nach dem, was wir bisher gesehen haben, ist der Hauptvorteil des ViewModel-Patterns, Code aus dem XAML-Code-Behind zu entfernen um die XAML-Bearbeitung unabhängiger zu machen . Wir erstellen nach wie vor je nach Bedarf Controller, um die Gesamtlogik unserer Anwendungen zu steuern (kein Wortspiel beabsichtigt).
Die grundlegenden MVCVM-Leitlinien, die wir befolgen, sind:
- Ansichten eine bestimmte Form von Daten anzeigen . Sie haben keine Ahnung, woher die Daten stammen.
- AnsichtModelle eine bestimmte Form von Daten und Befehlen enthalten Sie wissen nicht, woher die Daten oder der Code kommen und wie sie angezeigt werden.
- Modelle die eigentlichen Daten enthalten (verschiedene Kontext-, Speicher- oder andere Methoden)
- Controller warten auf Ereignisse und veröffentlichen sie. Controller liefern die Logik, die steuert, welche Daten wo zu sehen sind. Controller stellen den Befehlscode für das ViewModel bereit, so dass das ViewModel tatsächlich wiederverwendbar ist.
Wir haben auch festgestellt, dass die Sculpture code-gen framework implementiert MVVM und ein Muster, das dem von Prism ähnelt UND es macht auch ausgiebigen Gebrauch von Controllern, um die gesamte Anwendungsfalllogik zu trennen.
Gehen Sie nicht davon aus, dass Controller durch View-Modelle obsolet werden.
Ich habe einen Blog zu diesem Thema gestartet, den ich nach und nach ergänzen werde (nur Archiv, da das Hosting verloren ging) . Es gibt Probleme bei der Kombination von MVCVM mit den gängigen Navigationssystemen, da die meisten Navigationssysteme nur Views und VMs verwenden, aber darauf werde ich in späteren Artikeln eingehen.
Ein zusätzlicher Vorteil der Verwendung eines MVCVM-Modells ist, dass nur die Controller-Objekte müssen während der gesamten Lebensdauer der Anwendung im Speicher vorhanden sein und die Controller enthalten hauptsächlich Code und nur wenige Zustandsdaten (d. h. ein geringer Speicher-Overhead). Dies führt zu wesentlich weniger speicherintensiven Anwendungen als Lösungen, bei denen View-Modelle beibehalten werden müssen, und ist ideal für bestimmte Arten der mobilen Entwicklung (z. B. Windows Mobile mit Silverlight/Prism/MEF). Dies hängt natürlich von der Art der Anwendung ab, da Sie möglicherweise immer noch gelegentlich zwischengespeicherte VMs für die Reaktionsfähigkeit beibehalten müssen.
Hinweis: Dieser Beitrag wurde mehrfach überarbeitet und zielte nicht speziell auf die gestellte Frage ab, so dass ich den ersten Teil aktualisiert habe, um nun auch diese Frage zu behandeln. Ein Großteil der Diskussion in den Kommentaren unten bezieht sich nur auf ASP.Net und nicht auf das Gesamtbild. Dieser Beitrag sollte die breitere Verwendung von MVVM in Silverlight, WPF und ASP.Net abdecken und versuchen, die Leute davon abzuhalten, Controller durch ViewModels zu ersetzen.
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/