Wann ist es angemessen, ein DTO zurück zu seinem Entity-Gegenstück zu mappen?

7

Nach dem, was ich gelesen und implementiert habe, ist DTO das Objekt, das eine Teilmenge von Wert aus einem Datenmodell enthält, in den meisten Fällen sind dies unveränderliche Objekte.

Was ist mit dem Fall, in dem ich entweder einen neuen Wert übergeben oder in die Datenbank zurückkehren muss?

Sollte ich direkt mit dem Datenmodell / der tatsächlichen Entität von meinem DAL in meiner Präsentationsschicht arbeiten?

Oder soll ich ein DTO erstellen, das von der Präsentationsschicht an die Business-Schicht übergeben und dann in eine Entität umgewandelt werden kann, dann in der DB über einen ORM-Aufruf aktualisiert werden. Schreibst du zu viel Code? Ich gehe davon aus, dass dies erforderlich ist, wenn die Präsentationsebene kein Konzept des Datenmodells hat. Wenn wir mit diesem Ansatz fortfahren, sollte ich das Objekt erneut auf der BLL-Ebene holen, bevor ich die Änderung begehe?

    
aggietech 22.01.2015, 14:27
quelle

3 Antworten

3
  

Sollte ich direkt mit dem Datenmodell / der tatsächlichen Entität von meinem DAL in meiner Präsentationsschicht arbeiten?

Dies ist für kleine bis mittlere Projekte in Ordnung. Wenn Sie jedoch ein großes Projekt mit mehr als 5 Entwicklern haben, bei dem unterschiedliche Schichten verschiedenen Teams zugewiesen sind, profitiert das Projekt von der Verwendung eines DTO, um die Datenschicht von der Präsentationsschicht zu trennen.

Wenn sich ein DTO in der Mitte befindet, wirken sich Änderungen in der Präsentationsschicht nicht auf die Datenschicht aus (umgekehrt)

  

Oder soll ich ein DTO erstellen, das von der Präsentationsschicht an die Business-Schicht übergeben und dann in eine Entität umgewandelt werden kann, dann in der DB über einen ORM-Aufruf aktualisiert werden. Schreibst du zu viel Code? Ich gehe davon aus, dass dies erforderlich ist, wenn die Präsentationsebene kein Konzept des Datenmodells hat. Wenn wir mit diesem Ansatz fortfahren, sollte ich das Objekt erneut auf der BLL-Ebene holen, bevor ich die Änderung begehe?

Um eine neue Entity zu erstellen, ist dies der übliche Weg (zB "neuer Benutzer"). Zum Aktualisieren einer vorhandenen Entität konvertieren Sie keine DTO in eine Entität, sondern Sie rufen die vorhandene Entität ab, ordnen die neuen Werte zu und initiieren dann eine ORM-Aktualisierung.

%Vor%

Bei großen Projekten mit vielen Entwicklern ist der Nachteil, zu viel Code zu schreiben, minimal, verglichen mit dem großen Vorteil der Entkopplung.

Sehen Sie meinen Beitrag über Warum ein DTO verwenden

    
Yorro 23.01.2015, 07:20
quelle
15

Ein paar Gedanken:

  • DTO ist ein überladener Begriff, aber wie er für Data Transfer Objekt steht, sehe ich ihn eher als rein technischen, möglicherweise serialisierbaren container , um Daten von einem Punkt zum anderen zu übertragen, normalerweise über Ebenen oder Schichten. In einer Schicht, die sich mit geschäftlichen Belangen befasst, wie zum Beispiel der Domänenebene in DDD, werden diese kleinen Datenstrukturen, die zirkulieren, stattdessen Value Objects genannt, da sie eine geschäftliche Bedeutung haben und Teil der Ubiquitären Sprache der Domain sind. Es gibt alle Arten von feinen Unterschieden zwischen DTOs und Value Objects, so wie Sie normalerweise DTOs nicht vergleichen müssen, während Vergleich und Gleichheit ein wichtiges Anliegen in VOs sind (zwei VOs sind gleich, wenn ihre eingekapselten Daten gleich sind). p>

  • DDD legt großen Wert auf die Idee eines Rich-Domain-Modells. Das bedeutet, dass Sie DTOs normalerweise nicht einfach Domänenobjekten zuordnen, sondern versuchen, Geschäftsaktionen als absichtliche Methoden in Ihren Entitäten zu modellieren. Zum Beispiel würden Sie Setter nicht verwenden, um%% s_% der User , Street und City zu ändern, sondern stattdessen eine Methode ZipCode , moveTo(Address newAddress) ist ein Value-Objekt, das im Domain-Layer deklariert ist .

  • DTOs erreichen normalerweise nicht die Domain-Ebene, sondern durchlaufen den Filter einer Anwendungsschicht. Dies können Controller oder dedizierte Anwendungsdienste sein. Es sind Anwendungsschichtobjekte, die wissen, wie DTOs, die sie vom Client erhalten haben, in die richtigen Aufrufe von Domain-Layer-Entities (normalerweise aus Roots geladene Aggregat-Roots) umgewandelt werden. Eine weitere Verbesserung darüber ist die Erstellung aufgabenbasierter Benutzeroberflächen , in denen der Benutzer keine Daten sendet -centrierte DTOs aber Befehle, die ihr Endziel widerspiegeln.

Das Zuordnen von DTOs zu Entitäten ist also nicht wirklich der DDD-Weg, sondern eher ein CRUD-orientierter Ansatz.

    
guillaume31 23.01.2015 12:14
quelle
1

Meiner Meinung nach repräsentieren DTOs die Verträge (oder Nachrichten, wenn Sie so wollen), die die Grundlage für die Interaktion zwischen einer Aggregatwurzel und der Außenwelt bilden. Sie sind in der Domäne definiert, und der AR muss eingehende Instanzen verarbeiten und ausgehende Instanzen bereitstellen können. (Beachten Sie, dass die DTO-Instanzen in den meisten Fällen entweder vom AR oder vom AR bereitgestellt werden, aber nicht von beiden, da ein DTO, der in beide Richtungen fließt, normalerweise eine Verletzung der Trennung von Problemen darstellt .)

Gleichzeitig ist das AR verantwortlich für die Bereitstellung der Geschäftslogik, durch die die in den DTOs enthaltenen Daten verarbeitet werden. Die Präsentationsschicht (oder irgendein anderer Akteur, einschließlich der Datenzugriffsebene, ist in diesem Fall) ist frei, den gewünschten Kauderwelsch in ein DTO einzubringen und zu fordern, dass das AR es verarbeitet, und das AR muss den Inhalt des DTO interpretieren können als Kauderwelsch und erhebe eine Ausnahme.

Aufgrund dieser Anforderung ist es nie sinnvoll, ein DTO einfach auf sein Entity-Gegenstück abzubilden.

Der DTO muss immer durch die Logik im AR verarbeitet werden, um Änderungen in der Entity zu beeinflussen, die ihn in den vom DTO beschriebenen Zustand bringen können.

    
arootbeer 22.01.2015 14:37
quelle

Tags und Links