Frage

Was ist ein Data Transfer Object?

In MVC sind die Modellklassen DTO, und wenn nicht, was die Unterschiede sind und tun, müssen wir beide?

War es hilfreich?

Lösung

Ein Data Transfer Object ist ein Objekt, das verwendet wird, um Daten zu kapseln, und sie von einem Teilsystem einer Anwendung zur anderen senden.

DTOs meisten sind häufig durch die Dienstleistungsschicht in einer N-Tier-Anwendung verwendet, um Daten zwischen sich und der UI-Ebene. Der größte Vorteil hier ist, dass es die Datenmenge verringert, die über den Draht in verteilten Anwendungen gesendet werden muss. Sie sind auch große Modelle in der MVC-Muster.

Eine andere Verwendung für DTOs können Parameter für Methodenaufrufe kapseln. Dies kann nützlich sein, wenn eine Methode mehr als 4 oder 5 Parameter verwendet.

Wenn die DTO-Muster verwenden, würden Sie auch die Verwendung von DTO Monteuren machen. Die Montierer verwendet DTOs von Domain-Objekte zu erstellen, und umgekehrt.

Die Umwandlung von Domain-Objekt zu DTO und wieder zurück kann ein kostspieliger Prozess sein. Wenn Sie nicht eine verteilte Anwendung erstellen, werden Sie wahrscheinlich keine großen Vorteile aus dem Muster sehen, wie Martin Fowler erklärt hier

Andere Tipps

Die Definition für DTO kann auf Martin Fowler Website . DTOs werden verwendet, um Parameter zu Methoden und als Rückgabetypen zu übertragen. Viele Menschen nutzen die in der Benutzeroberfläche, aber andere aufblasen Domain-Objekte von ihnen.

Ein DTO ist ein stummes Objekt - es hält nur Eigenschaften und hat Getter und Setter, aber keine andere Logik von Bedeutung (außer vielleicht einen Vergleich () oder equals () Implementierung)

.

Normalerweise in MVC-Modell-Klassen (unter der Annahme, .net MVC hier) DTOs sind, oder Sammlungen / Aggregate von DTOs

Allgemein Wert Objekte sollte Immutable sein. Wie Integer oder String Objekte in Java. Wir können sie verwenden, um Daten zwischen Softwareschichten übertragen. Wenn die Softwareschichten oder Dienstleistungen in verschiedenem entfernten Knoten ausgeführt werden wie in einem Microservice Umgebung oder in einer Legacy-Java Enterprise App. Wir müssen fast exakte Kopien von zwei Klassen machen. Dies ist das, wo wir DTOs erfüllt werden.

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

In Vermächtnis Java Enterprise Systems DTOs kann es verschiedene EJB Sachen haben.

Ich weiß nicht, das ist eine bewährte Methode, oder nicht, aber ich persönlich benutzt Wert Objekte in meinem Spring MVC / Boot-Projekten wie folgt:

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

Controller Schicht nicht weiß, was sind die Entitäten sind. Er kommuniziert mit Form und Wert Objekte . Formularobjekte JSR 303 Validation Anmerkungen haben (zum Beispiel @NotNull) und Wert Objekte haben Jackson Annotations für benutzerdefinierte Serialisierung. (Zum Beispiel @JsonIgnore)

Service-Schicht kommuniziert mit Repository-Schicht über Entity Objects. Entity-Objekte haben JPA / Hibernate / Spring Data Anmerkungen darauf. Jede Schicht in Verbindung steht mit nur der unteren Schicht. Die Zwischenschicht-Kommunikation aufgrund des Kreises / zyklischer Abhängigkeit verboten ist.

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

Einige ORM Frameworks haben die Fähigkeit der Projektion über die Verwendung zusätzlicher Schnittstellen oder Klassen. So können Repositorys View-Objekte direkt zurück. Für Sie eine zusätzliche Transformation nicht brauchen.

Zum Beispiel ist dies unser Benutzer Einheit:

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

Aber Sie sollten eine Paginated Liste der Benutzer zurück, die gerade sind id, Vorname, Nachname. Dann können Sie einen Blick Wert Objekt für ORM Projektion erstellen.

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

Sie können leicht das paginierte Ergebnis aus dem Repository-Schicht erhalten. Dank Sie auch bis zum Frühjahr nur eine Schnittstelle für Projektionen verwenden können.

List<UserListItemView> find(Pageable pageable);

Keine Sorge für andere Umwandlungsvorgänge BeanUtils.copy Methode funktioniert gut.

  1. Für mich ist die beste Antwort auf die Frage was ein DTO ist ist, dass DTO sind einfache Objekte, die keine Geschäftslogik oder Methoden Implementierung enthalten sollte das würde erfordert die Prüfung .
  2. Normalerweise Ihr Modell (mit dem MVC-Pattern) sind intelligente Modelle, und sie können eine Menge / einige Methoden enthalten, die speziell für dieses Modell einige verschiedene Operationen ausführen (nicht Business-Logik, dies bei den Controllern sein sollte). Wenn Sie jedoch Daten übertragen (z. B. Aufrufen einer REST (GET / POST / was auch immer) Endpunkt von irgendwo, oder eine Webservice mit SOA raubend, etc ...) Sie wollen nicht auf die große Größe Objekt mit Code zu übertragen, die nicht ist notwendig für den Endpunkt, werden die Daten verbrauchen, und die Übertragung verlangsamen.

Mit MVC Datentransferobjekten werden häufig einfache Objekte abzubilden Domain-Modelle verwendet, die letztlich von der Ansicht angezeigt werden erhalten.

Wikipedia :

  

Datentransferobjekt (DTO), früher als Wertobjekte oder VO bekannt ist   ein Entwurfsmuster zum Übertragen von Daten zwischen Software-Anwendung verwendet   Subsystemen. DTOs werden oft in Verbindung mit dem Datenzugriff verwendet   Objekte Daten aus einer Datenbank abgerufen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top