Domanda

Che cos'è un oggetto di trasferimento dati?

In MVC ci sono le classi di modelli DTO, e se no quali sono le differenze e abbiamo bisogno di entrambe?

È stato utile?

Soluzione

Un oggetto trasferimento dati è un oggetto utilizzato per incapsulare i dati e inviarli da un sottosistema di un'applicazione a un altro.

I DTO sono più comunemente utilizzati dal livello Servizi in un'applicazione di livello N per trasferire dati tra se stesso e il livello UI. Il vantaggio principale qui è che riduce la quantità di dati che devono essere inviati attraverso il filo nelle applicazioni distribuite. Fanno anche grandi modelli nel modello MVC.

Un altro uso dei DTO può essere l'incapsulamento dei parametri per le chiamate al metodo. Ciò può essere utile se un metodo accetta più di 4 o 5 parametri.

Quando si utilizza il modello DTO, è necessario utilizzare anche assemblatori DTO. Gli assemblatori vengono utilizzati per creare DTO da Domain Objects e viceversa.

La conversione da oggetto di dominio a DTO e viceversa può essere un processo costoso. Se non stai creando un'applicazione distribuita, probabilmente non vedrai grandi benefici dal modello, come Martin Fowler spiega qui

Altri suggerimenti

La definizione di DTO è disponibile sul il sito di Martin Fowler . I DTO vengono utilizzati per trasferire i parametri ai metodi e come tipi di restituzione. Molte persone usano quelle nell'interfaccia utente, ma altre gonfiano da esse oggetti di dominio.

Un DTO è un oggetto stupido: contiene solo proprietà e ha getter e setter, ma nessun'altra logica di alcun significato (tranne forse un'implementazione compare () o equals ()).

Tipicamente le classi di modello in MVC (presupponendo qui .net MVC) sono DTO o raccolte / aggregati di DTO

In generale Oggetti valore dovrebbero essere immutabili. Come gli oggetti Integer o String in Java. Possiamo usarli per trasferire dati tra livelli software. Se i livelli o i servizi software sono in esecuzione in nodi remoti diversi, ad esempio in un ambiente di microservizi o in un'app Java Enterprise legacy. Dobbiamo fare copie quasi esatte di due classi. Questo è il luogo in cui abbiamo incontrato i DTO.

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

Nei DTO Java Enterprise Systems legacy possono essere presenti vari elementi EJB.

Non so che sia una buona pratica o no, ma uso personalmente oggetti valore nei miei progetti Spring MVC / Boot come questo:

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

Controller non sa quali siano le entità. Comunica con Modulo e Visualizza oggetti valore . Form Objects ha annotazioni di convalida JSR 303 (ad esempio @NotNull) e Visualizza oggetti valore hanno annotazioni Jackson per la serializzazione personalizzata. (ad esempio @JsonIgnore)

Il livello di servizio comunica con il livello del repository tramite Entity Objects. Gli oggetti entità hanno annotazioni JPA / Hibernate / Spring Data su di esso. Ogni livello comunica solo con il livello inferiore. La comunicazione tra livelli è vietata a causa della dipendenza circolare / ciclica.

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

Alcuni ORM hanno la capacità di proiettare usando interfacce o classi aggiuntive. Quindi i repository possono restituire direttamente gli oggetti View. Per te non è necessaria un'ulteriore trasformazione.

Ad esempio questa è la nostra entità Utente:

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

Ma dovresti restituire un elenco di utenti impaginati che includono solo id, nome, cognome. Quindi è possibile creare un oggetto valore vista per la proiezione ORM.

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

È possibile ottenere facilmente il risultato impaginato dal livello repository. Grazie a Spring puoi anche usare solo le interfacce per le proiezioni.

List<UserListItemView> find(Pageable pageable);

Non preoccuparti per altre operazioni di conversione BeanUtils.copy il metodo funziona perfettamente.

  1. Per me la migliore risposta alla domanda cos'è un DTO è che i DTO sono oggetti semplici che non dovrebbero contenere alcuna logica aziendale o implementazione di metodi che potrebbero richiede test .
  2. Normalmente il tuo modello (usando il modello MVC) sono modelli intelligenti e possono contenere molti / alcuni metodi che eseguono in modo specifico alcune operazioni diverse per quel modello (non la logica aziendale, questo dovrebbe essere ai controller). Tuttavia, quando si trasferiscono dati (ad es. Chiamando un endpoint REST (GET / POST / qualunque) da qualche parte o consumando un servizio web usando SOA, ecc ...) non si desidera trasmettere l'oggetto di grandi dimensioni con codice non necessario per l'endpoint, consumerà i dati e rallenterà il trasferimento.

Con MVC gli oggetti di trasferimento dati vengono spesso utilizzati per mappare i modelli di dominio su oggetti più semplici che alla fine verranno visualizzati dalla vista.

Da Wikipedia :

  

L'oggetto trasferimento dati (DTO), precedentemente noto come oggetti valore o VO, è   un modello di progettazione utilizzato per trasferire dati tra applicazioni software   sottosistemi. I DTO vengono spesso utilizzati insieme all'accesso ai dati   oggetti per recuperare dati da un database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top