DTO = ViewModel?

102

Ich verwende NHibernate, um meine Domänenobjekte beizubehalten. Um die Dinge einfach zu halten, verwende ich ein ASP.NET MVC-Projekt sowohl als Präsentationsschicht als auch als Serviceschicht.

Ich möchte meine Domänenobjekte in XML von meinen Controller-Klassen zurückgeben. Nachdem ich einige Beiträge hier auf Stack Overflow gelesen habe, habe ich festgestellt, dass DTOs der richtige Weg sind. Ich bin jedoch auch auf Beiträge gestoßen, die über das ViewModel sprechen.

Meine Frage: Sind Datenübertragungsobjekte und ViewModels dasselbe? Oder ist ein ViewModel eine Art Untermuster eines DTO?

autonomatt
quelle
9
Ich denke, es ist wichtig zu erwähnen, dass ViewModels in ASP.NET MVC nicht 100% äquivalent zu ViewModels in WPF (MVVM) sind, da die meisten Antworten MVVM erwähnen und Sie mit ASP.NET MVC arbeiten.
Matthijs Wessels

Antworten:

103

Die kanonische Definition eines DTO ist die Datenform eines Objekts ohne Verhalten.

ViewModels sind das Modell der Ansicht. ViewModels sind in der Regel vollständige oder teilweise Daten von einem oder mehreren Objekten (oder DTOs) sowie alle zusätzlichen Elemente, die für das Verhalten der Ansicht spezifisch sind (Methoden, die von der Ansicht ausgeführt werden können, Eigenschaften, die angeben, wie Ansichtselemente umgeschaltet werden usw.). Sie können das Ansichtsmodell als alle Daten für eine Ansicht plus Verhalten betrachten. ViewModels können Geschäftsobjekten oder DTOs eins zu eins zuordnen oder nicht.

NHibernate- Projektionen sind übrigens nützlich, wenn ein bestimmtes Ansichtsmodell eine Teilmenge der Daten eines persistierten Objekts benötigt.

Daniel Auger
quelle
Können Sie das erklären: "DTO ist die Datenform eines Objekts ohne Verhalten"?
Roozbeh S
2
Das heißt ... die DTO-Klasse enthält normalerweise nur Eigenschaften und keine Methoden mit Geschäftslogik usw.
Daniel Auger
70

ViewModel in ASP.NET MVC-Praxis ist dieselbe wie das DTO, jedoch unterscheidet sich ViewModel in MVVM-Muster von DTO, da ViewModel in MVVM Verhaltensweisen aufweist, DTO jedoch nicht.

Strahl
quelle
4
Dies ist eine schöne Antwort; wenn auch kurz auf Details.
Phil
5
Warum sollte das ViewModel in asp.net mvc mit einem DTO identisch sein? Das macht keinen Sinn. Ein ViewModel kann ein Verhalten haben, das ein DTO nicht hat. Dies hängt nicht von mvc ab.
Elisabeth
8
+1 zur Unterscheidung zwischen ASP.NET MVC ViewModel und MVVM ViewModel.
Ronald
4
@Elisa - Die Antwort auf Ihre ziemlich alte Frage lautet, dass die Ansicht in ASP.NET MVC Aktionen auf dem Controller (kein ViewModel) aufruft, um das Modell und die Ansicht zustandslos zu ändern. Aus diesem Grund entspricht ein zu einer Ansicht geformtes DTO im Wesentlichen dem ViewModel. In größeren Systemen mit einer anderen Serialisierungsgrenze kann ein DTO jedoch von Vorteil sein, wenn es von einem speziell für die Ansicht geformten ViewModel getrennt ist.
Dansan
28

DTO! = ViewModel

Im MVVM- Muster wird das ViewModel verwendet, um das Modell von der Ansicht zu isolieren. Zur Darstellung des Modells können Sie einfache DTO- Klassen verwenden, die wiederum über z. B. NHibernate einer Datenbank zugeordnet werden. Aber ich habe noch nie eine ViewModel-Klasse gesehen, die als DTO modelliert ist. ViewModel-Klassen haben meistens Verhalten, das DTOs nicht haben.

stiank81
quelle
2
DTOs können also nur Strukturen sein (oder ist eine Klasse, die die Fähigkeiten einer Struktur nachahmen sollte)?
Max Alexander
20

DTO - Data Transfer Objects sind genau so, wie es heißt, Container für die Datenübertragung. Sie haben kein Verhalten, sondern nur ein paar Setter und Getter. Einige Leute machen sie unveränderlich und erstellen bei Bedarf nur neue, anstatt vorhandene zu aktualisieren. Sie sollten serialisierbar sein, um eine Übertragung über das Kabel zu ermöglichen.

Im Allgemeinen werden DTOs verwendet, um Daten über Prozessgrenzen hinweg von einer Schicht zu einer anderen Schicht zu versenden, da Anrufe an einen Remote-Dienst teuer sein können, sodass alle erforderlichen Daten in ein DTO übertragen und in einem Block (grobkörnig) an den Client übertragen werden.

Einige Leute verwenden jedoch den Begriff der bildschirmgebundenen DTOs (nichts mit dem Überschreiten von Prozessgrenzen zu tun). Diese werden wiederum mit den erforderlichen Daten gefüllt (im Allgemeinen den für einen bestimmten Bildschirm erforderlichen Daten und können eine Ansammlung von Daten aus verschiedenen Quellen sein) und an den Client gesendet.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

In einfachen Fällen, wie bereits erwähnt, kann dieses DTO zum Binden an die Ansicht verwendet werden, in komplexeren Fällen würde es jedoch die Erstellung eines ViewModel und das Entladen von Daten von DTO zu ViewModel erfordern, was offensichtlich mehr Arbeit bedeutet (beim Anwenden des MVVM-Musters). .

Also nochmal wie schon gesagt DTO! = ViewModel

und

DTO und ViewModel haben unterschiedliche Lebensziele

David
quelle
13

Erstens besteht der Hauptunterschied darin, dass ViewModel Verhaltensweisen oder Methoden haben kann, die DTO nicht darf !!!

Zweitens: Wenn Sie DTO als ViewModel in ASP.NET MVC verwenden, ist Ihre Anwendung eng mit DTO verbunden, und genau das ist der entgegengesetzte Zweck der Verwendung von DTO. Wenn Sie dies tun, was ist der Unterschied bei der Verwendung Ihres Domain-Modells oder DTO, mehr Komplexität, um ein Anti-Pattern zu erhalten?

Auch ViewModel in ASP.NET kann DataAnnotations zur Validierung verwenden.

Das gleiche DTO kann unterschiedliche ViewModels-Zuordnungen haben, und ein ViewModel kann aus unterschiedlichen DTOs bestehen (immer mit Objektzuordnung, nicht Zusammensetzung). Da ich denke, dass es noch schlimmer ist, wenn Sie ein ViewModel haben, das ein DTO enthält, haben wir das gleiche Problem.

Wenn Sie von Ihrer Präsentationsebene aus DTO als Vertrag betrachten, erhalten Sie ein Objekt, das Sie als fremd für Ihre Anwendung betrachten müssen und auf das Sie keine Kontrolle haben (selbst wenn Sie nicht über den Dienst, die dto- und die Präsentationsebene verfügen sind deine).

Wenn Sie diese saubere Trennung durchführen, können Entwickler problemlos zusammenarbeiten. Die Person, die ViewModels, Views und Controller entwirft, muss sich nicht um die Service-Schicht oder die DTO-Implementierung kümmern, da sie die Zuordnung vornimmt, wenn die anderen Entwickler ihre Implementierung abgeschlossen haben. Sie kann sogar das Mocking-Tool oder das manuelle Mocking zum Füllen verwenden die Präsentationsschicht mit Daten für den Test.

Riadh Gomri
quelle
1
Ich habe gerade VS 2012 installiert und mir dort MVC 4 Single Page Application angesehen. Im Beispielprojekt werden DTOs als Parameter für Steuerungsmethoden (oder -aktionen) in WebApi verwendet. Mit anderen Worten, JSON wird an diese Methoden gesendet, und mit etwas MVC-Magie werden die Daten automatisch in DTOs konvertiert, bevor sie an die Methoden übergeben werden. Halten Sie es in diesem Fall für falsch, DTOs zu verwenden? Sollten ViewModels mit einer Web-API verwendet werden? Ich bitte um ein besseres Verständnis, weil ich mit diesen Konzepten noch nicht so vertraut bin.
Jean-François Beauchamp
Salut Jean-François Beauchamp :) ASP.NET MVC kann URL-Kinderwagen in ein Objekt analysieren, zum Beispiel: Angenommen, ich habe diese Zuordnung zu einer Indexmethode ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} "anstatt zu haben Im Steuerindex (int jobID, int ResultsToSkip, int ResultsToSend) habe ich Index (request) (request ist ein Objekt, das 3 Felder jobID kapselt ...). Anstelle von params sprechen Sie jetzt mit Ihrer Anwendung mit Objekten, die kapseln DATA, also ja, wir können requestDTO sagen. Zum Beispiel müssen Sie ein weiteres Feld hinzufügen, Sie ändern nur das DTO, nicht die API-Schnittstellenmethoden.
Riadh Gomri
9

Für einige einfache Ansichten verwende ich mein DTO als meine Modelle, aber wenn Ansichten komplexer werden, erstelle ich ViewModels.

Für mich ist es ein Gleichgewicht zwischen Schnelligkeit (mit DTO, da ich sie bereits habe) und Flexibilität (das Erstellen von ViewModels bedeutet eine stärkere Trennung von Bedenken).

sgwill
quelle
2
Schöne pragmatische Antwort.
Simon Tewsi
0

Wenn Sie DTO als ViewModel verwenden, bedeutet dies, dass Sie aus irgendeinem Grund, aus dem Sie DTO ändern, eine hohe Abhängigkeit von DTO haben. Dies kann sich auf ViewModel auswirken.

Verwenden Sie DTO besser und konvertieren Sie es in ein Ansichtsmodell.

Lalit Khanna
quelle
-1

Wir können DTO verwendenWie bei der Modellklasse können wir viewmodel verwenden, wenn wir mehrere Modelldaten / -eigenschaften in einer einzigen Ansicht anzeigen / verwenden müssen. Beispiel: Ich erstelle zuerst ein Modell mit der Entity Framework-Datenbank. Jetzt wird das gesamte Modell basierend auf der Datenbank generiert. und jetzt benötigen wir Datenanmerkungen. Für diese Datenanmerkungen können wir einen Ordnernamen DTO erstellen. In diesem DTO-Ordner können wir alle Modelle exakt halten, die bereits Datenanmerkungen über der Eigenschaft generieren und hinzufügen. Dann können wir jede Operation (Controller verwenden, Ansichten verwenden) mit diesen DTO-Klassen verwenden. Und wenn wir eine komplexe Ansicht benötigen, meine ich, wenn wir mehrere Klassendaten in einer Ansicht benötigen, können wir das Ansichtsmodell verwenden. Für viewmodel können wir einen Ordnernamen viewmodel erstellen, dann eine benutzerdefinierte Klasse erstellen und die Eigenschaft beibehalten, die wir benötigen. Ich versuchte mich zu klären. Jeder Vorschlag sehr geschätzt.

Md. Saddam Hossain
quelle