Was ist der Unterschied zwischen einem MVC-Modellobjekt, einem Domänenobjekt und einem DTO?

77

Was ist der Unterschied zwischen einem MVC-Modellobjekt, einem Domänenobjekt und einem DTO?

Mein Verständnis ist:

MVC-Modellobjekt:

Modelliert die anzuzeigenden Daten durch eine entsprechende Ansicht. Es wird möglicherweise nicht direkt einem Domänenobjekt zugeordnet, dh es kann Daten von einem oder mehreren Domänenobjekten enthalten.

  1. Client-Seite
  2. Kann Geschäftslogik enthalten. Z.B. Validierungen, berechnete Eigenschaften usw.
  3. Keine persistenzbezogenen Methoden

Domänenobjekt:

Ein Objekt, das reale Objekte in der Problemdomäne wie Reservierung, Kunde, Bestellung usw. modelliert. Wird zum Speichern von Daten verwendet.

  1. Serverseite
  2. Keine Geschäftslogik

DTO (Datenübertragungsobjekt):

Ein Objekt, das zum Übertragen von Daten zwischen Ebenen verwendet wird, wenn sich die Ebenen in separaten Prozessen befinden, z. B. von einer Datenbank zu einer Client-App. Ermöglicht eine einzelne Transaktion über die Leitung anstatt mehrerer Aufrufe beim Abrufen von Daten, die mehreren Domänenobjekten entsprechen. Ein DTO enthält nur Daten- und Zugriffsmethoden, und es ist keine Logik vorhanden. Die Daten beziehen sich auf eine bestimmte DB-Transaktion, sodass sie möglicherweise direkt einem Domänenobjekt zugeordnet werden oder nicht, da sie Daten von einem oder mehreren Domänenobjekten enthalten können.

  1. Wird sowohl auf Server- als auch auf Clientseite verwendet, wenn es zwischen Ebenen übertragen wird
  2. Keine Geschäftslogik
  3. Keine persistenzbezogenen Methoden

Also die Fragen:

  1. Ist das obige Verständnis richtig? Vermisse ich einige wichtige Punkte?

  2. Gibt es Gründe, Domänenobjekte nicht als MVC-Modell zu verwenden, vorausgesetzt, die Modellobjekte erfordern keine zusätzliche Geschäftslogik?

  3. Gibt es Gründe, DTOs nicht als MVC-Modell zu verwenden, vorausgesetzt, die Modellobjekte erfordern keine zusätzliche Geschäftslogik?

Timothy Mowlem
quelle
9
gute Frage .. +1
Nawfal

Antworten:

23

Domänen- und Modellobjekte sind im Wesentlichen identisch und können Geschäftslogik enthalten. Abhängig von der Implementierung können Domänen- und DTO-Objekte gleichwertig sein, wenn Sie Geschäftslogik aus dem Modell in eine Serviceklasse entfernen.

Häufig ist eine Schlüsselvariante des DTO das Ansichtsmodell, das lediglich zum Übertragen von Daten zwischen dem Domänenmodell und der Ansicht verwendet wird, obwohl ein Ansichtsmodell häufig Logik enthalten kann, obwohl dies eine reine UI-Logik sein sollte.

ProfK
quelle
Vielen Dank an beide Antwortenden. Es scheint mir jetzt klarer. Domänenobjekte können Geschäftslogik wie Validierung und Logik haben, die sich direkt auf die Daten bezieht.
Timothy Mowlem
2
Ein separates MVC-Modellobjekt ist nur erforderlich, um die Logik für die Anzeige der Daten in der Ansicht zu kapseln. Wenn keine vorhanden sind, ist es einfacher, das Domänenobjekt als MVC-Modellobjekt zu verwenden.
Timothy Mowlem
9

Die Domäne und das DTO können auch Ihre "Modell" -Objekte sein. Sie können die Details des Domänenobjekts "Kunde" rendern.

Ein Domänenobjekt kann über eine Geschäftslogik verfügen, um die Eigenschaften der Domänenentität zu erzwingen. Validierung ist ein solcher Fall. Das Domänenobjekt selbst enthält keine persistenzbezogenen Methoden, kann jedoch Metadaten (wie Anmerkungen) enthalten, um die Persistenz zu unterstützen

Das POJO-Programmiermodell ermöglicht die Verwendung des gleichen Objekts wie Ihre Domänen-, DTO- und Modellobjekte. Im Wesentlichen werden keine externen Schnittstellen implementiert, die nur für eine Ebene gelten, für andere jedoch nicht.

Kartheek
quelle
1
Ja, das mache ich. In fast allen Fällen musste ich nie etwas anderes als das Domain-Objekt verwenden. DTO wäre für eine komplexe Abfrage mit mehreren Datenelementen gedacht, die sich über Domänenobjekte erstrecken.
Timothy Mowlem
1
Und eine separate MVC-Modellklasse ist nur dann wirklich erforderlich, wenn mit den anzuzeigenden Modelldaten eine signifikante Geschäftslogik / -verarbeitung verbunden ist?
Timothy Mowlem
1
Ja, das ist ein Grund, ein geeignetes dediziertes Modell zu haben, anstatt ein Domänenobjekt zu verwenden. Ihr Domain-Objekt speichert möglicherweise nur das Datum UTC und das reicht auch für Ihre gesamte Geschäftslogik. Angenommen, Sie müssen es auf der Benutzeroberfläche in der Zeitzone des Benutzerkontos anzeigen. Ein Modell ist hilfreich, um diese UI-spezifischen Berechnungen durchzuführen.
Kartheek
5
A DTO = is an object that carries data between processes.

Das Interessanteste ist jedoch, dass es kein Verhalten außer dem Speichern und Abrufen seiner eigenen Daten hat !!!

An der MVC-Methodik festhalten ...

Domain = subject of your entire application.

Model = contains the (programming languages objects : EX: C# objects) to make up the universe of your application.

Sie können offensichtlich Verhalten und Eigenschaften haben (siehe Unterschied zu DTO).

Oft kann eine Anwendung (eine leichte) ein Modell haben - ein Fall, in dem Ihr Modell genau Ihre Domäne ist. Ein anderes Modell kann ein völlig anderer Objekttyp sein, der ein anderes verarbeitet. Beide sind in diesem Fall Teil Ihrer Domain und werden als "Domain-Modelle - Objekte" bezeichnet.

Hoffentlich ist diese Antwort erschöpfend und macht alles für Sie klar!

Iulian Radulescu
quelle
3

Mein Verständnis (kurz gesagt) ist wie folgt:

(MVC) Modellobjekt:

  • einige Dinge in einem bestimmten Verwendungskontext darstellen, z. PersonEditModel, PersonViewModelOder einfach nurPersonModel
  • hat keine Geschäftslogik
  • kann Gegenstand einer Validierungslogik usw. sein.
  • wird verwendet, um Daten von einer Anwendungsschicht zu einer anderen bereitzustellen, z. MVC Controller <-> MVC-Ansicht

Domänenobjekt:

  • stellt ein Geschäftsobjekt dar (reales Objekt in der Problemdomäne)
  • hat Geschäftslogik
  • Ungültigen Objektstatus nicht zulassen, verfügt über Methoden zum ordnungsgemäßen Ändern des Objektstatus
  • wird verwendet, um die damit verbundene Geschäftslogik zu kapseln
  • müssen nicht verwendet werden, um Daten zu speichern (oder sollten es auch nicht)

DTO (Datenübertragungsobjekt):

  • ähnlich dem Modellobjekt, sollte jedoch eine flache Struktur haben
  • nur einfache Typeneigenschaften / Felder (Zeichenfolgen, Zahlen, Datums- und Uhrzeitangaben, Boolesche Werte)
  • wird verwendet, um Daten über Anwendungsgrenzen hinweg zu übertragen, z. zwischen Webserver und Webbrowser
owerkop
quelle
makellose Antwort!
Gaurav
2

Jede Definition für die meisten Objekte ist je nach Verwendungsort der Objekte unterschiedlich:

Model: ist eine allgemeine Definition für die Verwendung von Objekten in Clients oder Servern .

  1. Model View: ist ein Objekt, das die clientmeiste Zeit verwendet wird.
  2. Domain Object: ist ein Objekt , das in serverund verwendet transfering data to the database.
  3. Data Transfer Object(DTO): ist ein Objekt, das Daten von einem Objekt zu einem anderen Objekt überträgt , insbesondere beim Abrufen von Daten API Call(zum Beispiel: In api GET Methodenaufruf zum Abrufen von Daten dürfen Sie dem Client keine Datenbankmodelle geben, für diesen Zweck verwenden Sie dto).

Hinweis: the definitions are true most of the timeIn einigen Situationen ist dies jedoch nicht praktikabel.

Sina Lotfi
quelle
1

1) Nein, es ist eine Definition von ViewModel. MVC Model Object und Domain Object sind beide identisch.
2) Domänenmodelle (Objekte) sind immer vorhanden, Geschäftslogik ist optional.
3) Wenn im Geschäftsobjekt keine Geschäftslogik vorhanden ist, wird sie automatisch zu DTO.

palash140
quelle