it-swarm.com.de

Was bringt es, DTO (Data Transfer Objects) zu verwenden?

Was bringt es, DTO zu verwenden, und ist es ein veraltetes Konzept? Ich verwende POJO s in der Ansichtsebene, um Daten zu übertragen und beizubehalten. Können diese POJOs als Alternative zu DTOs betrachtet werden?

146

DTO ist ein Muster und unabhängig von der Implementierung (POJO/POCO). DTO sagt, da jeder Anruf an eine Remote-Schnittstelle teuer ist, sollte die Antwort auf jeden Anruf so viele Daten wie möglich bringen. Wenn also mehrere Anforderungen erforderlich sind, um Daten für eine bestimmte Aufgabe zu übertragen, können die zu übermittelnden Daten in einem DTO kombiniert werden, sodass nur eine Anforderung alle erforderlichen Daten bereitstellen kann. Katalog der Muster der Unternehmensanwendungsarchitektur enthält weitere Details.

DTOs sind ein grundlegendes Konzept, nicht veraltet.

125
theD

DTO als Konzept (Objekte, deren Zweck darin besteht, Daten zu sammeln, die vom Server an den Client zurückgegeben werden sollen) ist sicherlich nicht veraltet.

Was ist etwas veraltet ist, ist die Vorstellung, dass DTOs, die überhaupt keine Logik enthalten, nur zum Übertragen von Daten und "Zuordnen" von Domänenobjekten vor der Übertragung an den Client verwendet werden. und dort zugeordnet, um Modelle anzuzeigen, bevor sie an die Anzeigeebene übergeben werden. In einfachen Anwendungen können die Domänenobjekte häufig direkt als DTOs wiederverwendet und direkt an die Anzeigeebene weitergeleitet werden, sodass nur ein einheitliches Datenmodell vorhanden ist. Bei komplexeren Anwendungen möchten Sie nicht das gesamte Domänenmodell für den Client verfügbar machen. Daher ist eine Zuordnung von Domänenmodellen zu DTOs erforderlich. Ein separates Ansichtsmodell, das die Daten aus den DTOs dupliziert, ist fast nie sinnvoll.

Der Grund, warum dieser Begriff veraltet und nicht einfach falsch ist, ist, dass einige (hauptsächlich ältere) Frameworks/Technologien dies erfordern, da ihre Domänen- und Ansichtsmodelle keine POJOS sind und stattdessen direkt an das Framework gebunden sind.

Insbesondere waren Entity Beans in J2EE vor dem EJB 3-Standard keine POJOs, sondern Proxy-Objekte, die vom App-Server erstellt wurden. Es war einfach nicht möglich, sie an den Client zu senden, sodass Sie keine andere Wahl hatten, eine separate DTO-Schicht zu erstellen - Es war obligatorisch.

62

Obwohl DTO kein veraltetes Muster ist, wird es häufig unnötig angewendet, wodurch es möglicherweise veraltet erscheint.

Von Java Guru Adam Bean:

Das am häufigsten missbrauchte Muster in der Java Enterprise-Community ist das DTO. DTO wurde klar als Lösung für ein Verteilungsproblem definiert. DTO sollte ein grobkörniger Datencontainer sein, der Daten effizient zwischen ihnen transportiert Prozesse (Ebenen). ~ Adam Bien

Von Martin Fowler:

DTOs werden als Datenübertragungsobjekte bezeichnet, da ihr gesamter Zweck darin besteht, Daten in teuren Fernaufrufen zu verschieben. Sie sind Teil der Implementierung einer grobkörnigen Schnittstelle, die eine Remote-Schnittstelle für die Leistung benötigt. Sie benötigen sie nicht nur nicht in einem lokalen Kontext, sie sind auch schädlich, da eine grobkörnige API schwieriger zu verwenden ist und Sie die gesamte Arbeit erledigen müssen, um Daten aus Ihrer Domäne oder Datenquellenschicht in die DTOs zu verschieben. ~ Martin Fowler

Hier ist ein Java EE-spezifisches Beispiel für eine häufige, aber falsche Verwendung des DTO-Musters. Wenn Sie nicht vertraut sind Mit Java EE müssen Sie nur das MVC-Muster kennen: Eine "JSF ManagedBean" ist eine Klasse, die von der Ansicht verwendet wird, und eine "JPA-Entität" ist das Modell im MVC-Muster.

Angenommen, Sie haben eine JSF ManagedBean. Eine häufig gestellte Frage ist, ob die Bean einen Verweis auf eine JPA-Entität direkt enthalten soll oder ob sie einen Verweis auf ein Zwischenobjekt beibehalten soll, das später in eine Entität konvertiert wird. Ich habe gehört, dass dieses Zwischenobjekt als DTO bezeichnet wird. Wenn Ihre ManagedBeans und Entities jedoch in derselben JVM ausgeführt werden, hat die Verwendung des DTO-Musters nur geringe Vorteile.

Berücksichtigen Sie außerdem die Anmerkungen zur Bean-Validierung (wenn Sie mit Java EE nicht vertraut sind, wissen Sie, dass die Bean-Validierung eine API zum Validieren von Daten ist). Ihre JPA-Entitäten werden wahrscheinlich mit @NotNull und @ kommentiert Größenüberprüfungen: Wenn Sie ein DTO verwenden, möchten Sie diese Überprüfungen in Ihrem DTO wiederholen, damit Clients, die Ihre Remote-Schnittstelle verwenden, keine Nachricht senden müssen, um herauszufinden, dass die grundlegende Überprüfung fehlgeschlagen ist. Stellen Sie sich das alles vor Zusätzliche Arbeit beim Kopieren von Bean Validation-Anmerkungen zwischen Ihrem DTO und der Entität. Wenn Ihre Ansicht und Entitäten jedoch in derselben JVM ausgeführt werden, müssen Sie diese zusätzliche Arbeit nicht übernehmen: Verwenden Sie einfach die Entitäten.

Der Link von IAmTheDude zu Katalog der Muster der Unternehmensanwendungsarchitektur bietet eine kurze Erklärung der DTOs, und hier sind weitere Referenzen, die ich als aufschlussreich empfunden habe:

19
DavidS

Absolut nicht! Erst kürzlich habe ich Lektionen über die bessere Verwendung von DTOs gelernt anstatt Ihres Geschäftsobjekts, das Sie verwenden (möglicherweise an Ihren ORM-Mapper gebunden).

Verwenden Sie sie jedoch nur, wenn sie für die Verwendung geeignet sind, und nicht nur, um sie zu verwenden, da sie in einem guten Musterbuch erwähnt werden.
Ein typisches Beispiel, das mir gerade in den Sinn kommt, ist, wenn Sie eine Art Schnittstelle für Dritte verfügbar machen. In einem solchen Szenario möchten Sie die ausgetauschten Objekte ziemlich stabil halten, was Sie normalerweise mit DTOs gut erreichen können.

9
Juri

Ich habe festgestellt, dass DTOs besonders nützlich sind, wenn sie Logik für API-Antworten enthalten. Mit diesem Muster ist es einfach, verschiedene Arten von Antworten von Objekten auf verschiedene Formate auf testbare Weise zu verwalten. Mit diesem Muster konnten wir in meiner aktuellen Rolle damit beginnen, die Antwortformate für unsere APIs zu testen. Dies ist wertvoll, da unser Stack mit verschiedenen Clients (http/mobile) isomorpher wird. Auf keinen Fall veraltet.

2
zquintana