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?
asp.net-mvc
domain-driven-design
viewmodel
dto
autonomatt
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle
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).
quelle
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.
quelle
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.
quelle