it-swarm.com.de

Was ist ein Datenübertragungsobjekt?

Was ist ein Datenübertragungsobjekt?

In MVC sind die Modellklassen DTO, und wenn nicht, was sind die Unterschiede und brauchen wir beide?

180
Yaron Naveh

Ein Datenübertragungsobjekt ist ein Objekt, mit dem Daten gekapselt und von einem Subsystem einer Anwendung an ein anderes gesendet werden.

DTOs werden am häufigsten von der Services-Schicht in einer N-Tier-Anwendung verwendet, um Daten zwischen sich selbst und der UI-Schicht zu übertragen. Der Hauptvorteil hierbei ist, dass die Datenmenge reduziert wird, die in verteilten Anwendungen über das Kabel gesendet werden muss. Sie machen auch tolle Modelle im MVC-Muster.

Eine andere Verwendung für DTOs kann darin bestehen, Parameter für Methodenaufrufe zu kapseln. Dies kann nützlich sein, wenn eine Methode mehr als 4 oder 5 Parameter akzeptiert.

Bei Verwendung des DTO-Musters würden Sie auch DTO-Assembler verwenden. Die Assembler werden zum Erstellen von DTOs aus Domänenobjekten verwendet und umgekehrt.

Die Konvertierung von Domain Object nach DTO und wieder zurück kann ein kostspieliger Prozess sein. Wenn Sie keine verteilte Anwendung erstellen, werden Sie wahrscheinlich keine großen Vorteile aus dem Muster ziehen, wie erklärt Martin Fowler hier

184
Benny Hallett

Die Definition für DTO finden Sie auf Martin Fowlers Website . DTOs werden verwendet, um Parameter an Methoden und als Rückgabetypen zu übergeben. Viele Benutzer verwenden diese in der Benutzeroberfläche, andere blähen jedoch Domänenobjekte von ihnen auf.

24
blu

Ein DTO ist ein dummes Objekt - es enthält nur Eigenschaften und hat Getter und Setter, aber keine andere Logik von Bedeutung (außer vielleicht eine compare () - oder equals () -Implementierung).

Typischerweise sind Modellklassen in MVC (hier .net MVC vorausgesetzt) ​​DTOs oder Sammlungen/Aggregate von DTOs

19
Eric Petroelje

Im Allgemeinen sollte Wertobjekte unveränderlich sein. Wie Integer oder String Objekte in Java. Wir können sie zum Übertragen von Daten zwischen Softwareschichten verwenden. Wenn die Softwareschichten oder -dienste auf verschiedenen Remote-Knoten ausgeführt werden, z. B. in einer Microservices-Umgebung oder in einer älteren Java Enterprise-App. Wir müssen von zwei Klassen fast exakte Kopien anfertigen. Hier haben wir DTOs getroffen.

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|

In älteren Java Enterprise Systems-DTOs können verschiedene EJB-Inhalte enthalten sein.

Ich weiß nicht, ob dies eine bewährte Methode ist oder nicht, aber ich persönlich verwende Value Objects in meinen Spring MVC/Boot-Projekten wie folgt:

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|

Controller Layer weiß nicht, was die Entities sind. Es kommuniziert mit Form und View Value Objects. Formularobjekte haben JSR 303-Validierungsanmerkungen (z. B. @NotNull) und Wertobjekte anzeigen Jackson-Anmerkungen für benutzerdefinierte Serialisierung. (zum Beispiel @JsonIgnore)

Die Service-Schicht kommuniziert mit der Repository-Schicht über Entity Objects. Entitätsobjekte sind mit JPA/Hibernate/Spring Data-Anmerkungen versehen. Jede Schicht kommuniziert nur mit der unteren Schicht. Die Kommunikation zwischen den Schichten ist aufgrund der zirkularen/zyklischen Abhängigkeit verboten.

User Service ----> XX CANNOT CALL XX ----> Order Service

Einige ORM Frameworks können über die Verwendung zusätzlicher Schnittstellen oder Klassen projiziert werden. So können Repositorys View-Objekte direkt zurückgeben. Dafür brauchst du keine zusätzliche Transformation.

Zum Beispiel ist dies unsere Benutzerentität:

@Entity
public final class User {
    private String id;
    private String firstname;
    private String lastname;
    private String phone;
    private String fax;
    private String address;
    // Accessors ...
}

Sie sollten jedoch eine paginierte Liste von Benutzern zurückgeben, die nur ID, Vorname und Nachname enthält. Anschließend können Sie ein View Value Object für die ORM-Projektion erstellen.

public final class UserListItemView {
    private String id;
    private String firstname;
    private String lastname;
    // Accessors ...
}

Sie können das paginierte Ergebnis auf einfache Weise aus der Repository-Ebene abrufen. Dank spring können Sie auch nur Schnittstellen für Projektionen verwenden.

List<UserListItemView> find(Pageable pageable);

Machen Sie sich keine Sorgen um andere Konvertierungsvorgänge. Die Methode BeanUtils.copy Funktioniert einwandfrei.

10
Fırat KÜÇÜK
  1. Für mich ist die beste Antwort auf die Frage , was ein DTO ist , dass DTOs sind einfache Objekte, die keine Geschäftslogik oder Methodenimplementierung enthalten sollten, die getestet werden müssten .
  2. Normalerweise handelt es sich bei Ihrem Modell (unter Verwendung des MVC-Musters) um intelligente Modelle, und sie können viele/einige Methoden enthalten, die einige unterschiedliche Operationen für dieses Modell ausführen (nicht die Geschäftslogik, dies sollte bei den Controllern erfolgen). Wenn Sie jedoch Daten übertragen (z. B. einen Endpunkt REST (GET/POST/whatever) aufrufen oder einen Webservice mit SOA usw ...) Sie möchten das große Objekt nicht mit Code übertragen, der für den Endpunkt nicht erforderlich ist, verbrauchen Daten und verlangsamen die Übertragung.
8
Thiago Burgos

Bei der MVC-Datenübertragung werden häufig Objekte verwendet, um Domänenmodelle einfacheren Objekten zuzuordnen, die letztendlich von der Ansicht angezeigt werden.

Aus Wikipedia :

Data Transfer Object (DTO), früher als Value Objects oder VO bezeichnet, ist ein Entwurfsmuster, das zum Übertragen von Daten zwischen Softwareanwendungssubsystemen verwendet wird. DTOs werden häufig in Verbindung mit Datenzugriffsobjekten verwendet, um Daten aus einer Datenbank abzurufen.

5
Dan