Qu'est-ce que L'objet de transfert de données?

Qu'est-ce qu'un objet de transfert de données?

Dans MVC sont les classes de modèle DTO, et sinon quelles sont les différences et avons-nous besoin des deux?

138
demandé sur Soner Gönül 2009-06-27 00:40:23

7 réponses

Un objet de transfert de données est un objet utilisé pour encapsuler des données et les envoyer d'un sous-système d'une application à un autre.

Les DTO sont les plus couramment utilisés par la couche Services dans une application à n niveaux pour transférer des données entre elle - même et la couche D'interface utilisateur. Le principal avantage ici est qu'il réduit la quantité de données qui doivent être envoyées à travers le fil dans les applications distribuées. Ils font également de grands modèles dans le modèle MVC.

Une autre utilisation pour les DTO peut être encapsuler les paramètres pour les appels de méthode. Cela peut être utile si une méthode prend plus de 4 ou 5 paramètres.

Lorsque vous utilisez le modèle DTO, vous utiliserez également des assembleurs DTO. Les assembleurs sont utilisés pour créer des Dto à partir D'objets de domaine, et vice versa.

La conversion de L'objet de domaine en DTO et retour peut être un processus coûteux. Si vous ne créez pas d'application distribuée, vous ne verrez probablement pas de grands avantages du modèle, comme l'explique Martin Fowler ici

151
répondu Benny Hallett 2009-06-29 13:09:41

La définition de DTO se trouve sur le site de Martin Fowler . Les DTO sont utilisés pour transférer des paramètres vers des méthodes et comme types de retour. Beaucoup de gens utilisent ceux de L'interface utilisateur, mais d'autres gonflent les objets de domaine.

22
répondu blu 2009-06-26 20:43:28

Un DTO est un objet muet-il contient juste des propriétés et a des getters et des setters, mais aucune autre logique de signification (autre que peut-être une implémentation compare() ou equals ()).

Typiquement, les classes de modèle dans MVC (en supposant que. NET MVC ici) sont des Dto, ou des collections/agrégats de DTO

15
répondu Eric Petroelje 2009-06-26 20:44:46

En général Les objets de valeur doivent être immuables. Comme Integer ou String objets en Java. Nous pouvons les utiliser pour transférer des données entre les couches logicielles. Si les couches logicielles ou les services s'exécutent dans différents nœuds distants, comme dans un environnement microservices ou dans une application Java Enterprise héritée. Nous devons faire des copies presque exactes de deux classes. C'est là que nous avons rencontré les DTO.

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

Dans les anciens systèmes D'entreprise Java, les DTO peuvent avoir plusieurs éléments EJB dans il.

Je ne sais pas si c'est une bonne pratique ou non mais j'utilise personnellement Value Objects dans mes projets Spring MVC / Boot comme ceci:

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

La couche Controller ne sait pas quelles sont les entités. Il communique avec Forme et Afficher des Objets de Valeur de. Les objets de formulaire ont des annotations de Validation jsr 303 (par exemple @NotNull) et Les objets de valeur de vue ont des Annotations Jackson pour la sérialisation personnalisée. (par exemple @JsonIgnore)

La couche de Service communique avec la couche de référentiel via L'utilisation D'objets Entity. Les objets Entity ont des annotations de données JPA / Hibernate/Spring. Chaque couche communique uniquement avec la couche inférieure. La communication inter-couche est interdite en raison de la dépendance circulaire/cyclique.

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

Certains Frameworks ORM ont la capacité de projection via l'utilisation d'interfaces ou de classes supplémentaires. Ainsi, les référentiels peuvent renvoyer directement des objets de vue. Là pour vous ne le faites pas besoin d'une transformation supplémentaire.

Par exemple, c'est notre entité Utilisateur:

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

Mais vous devriez renvoyer une liste paginée d'utilisateurs qui incluent simplement id, firstname, lastname. Ensuite, vous pouvez créer un objet de valeur de vue pour la projection ORM.

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

Vous pouvez facilement obtenir le résultat paginé à partir de la couche de référentiel. Grâce à spring, vous pouvez également utiliser uniquement des interfaces pour les projections.

List<UserListItemView> find(Pageable pageable);

Ne vous inquiétez pas pour d'autres opérations de conversion BeanUtils.copy méthode fonctionne juste fin.

10
répondu Fırat KÜÇÜK 2017-08-19 15:17:39

Avec MVC, les objets de transfert de données sont souvent utilisés pour mapper des modèles de domaine à des objets plus simples qui seront finalement affichés par la vue.

À Partir De Wikipedia:

L'objet de transfert de données (DTO), anciennement appelé objets de valeur ou VO, est un modèle de conception utilisé pour transférer des données entre une application logicielle les sous-systèmes. Les DTO sont souvent utilisés conjointement avec l'accès aux données objets à récupérer des données à partir d'une base de données.

5
répondu Dan 2017-03-06 11:26:25

1) pour moi, la meilleure réponse à la question qu'est-ce qu'un DTO est que les DTO sont des objets simples qui ne devraient contenir aucune logique métier ou implémentation de méthodes nécessitant des tests.

2) Normalement, votre modèle (en utilisant le modèle MVC) sont des modèles intelligents, et ils peuvent contenir beaucoup de/certaines méthodes qui font des opérations différentes pour ce modèle spécifiquement (pas de logique métier, cela devrait être aux contrôleurs). Cependant, lorsque vous transférez des données (par exemple. l'appel de REPOS (GET/POST/whatever) point de terminaison de quelque part, ou consommer un webservice en utilisant soa, etc...) vous ne voulez pas transmettre l'objet de grande taille avec du code qui n'est pas nécessaire pour le point de terminaison, consommera des données et ralentira le transfert.

4
répondu Thiago Burgos 2015-03-18 12:52:18

Les DTO existent face à la sagesse conventionnelle de DonotRepeatYourself. Soyez très prudent et soyez absolument sûr que vous avez besoin d'un DTO

-1
répondu Simbosan 2018-06-27 03:03:27