Qu’est-ce qu’un object de transfert de données?

Qu’est-ce qu’un object de transfert de données?

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

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

Les couches DTO sont le plus souvent utilisées par la couche Services dans une application N-Tier pour transférer des données entre elle-même et la couche d’interface utilisateur. Le principal avantage réside dans le fait qu’il réduit la quantité de données à envoyer sur le réseau dans les applications dissortingbuées. Ils font également d’excellents modèles dans le modèle MVC.

Une autre utilisation des DTO peut être d’encapsuler les parameters pour les appels de méthode. Cela peut être utile si une méthode prend plus de 4 ou 5 parameters.

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’objects de domaine et inversement.

La conversion d’un object de domaine en DTO et inversement peut être un processus coûteux. Si vous ne créez pas une application dissortingbuée, vous ne verrez probablement pas de grands avantages, comme l’ explique Martin Fowler ici.

La définition de DTO se trouve sur le site de Martin Fowler . Les DTO sont utilisés pour transférer des parameters vers des méthodes et des types de retour. Beaucoup de gens utilisent ceux de l’interface utilisateur, mais d’autres gonflent les objects du domaine.

Un DTO est un object stupide – il ne contient que des propriétés et des getters et des setters, mais aucune autre logique significative (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

En général, les objects de valeur doivent être immuables. Comme les objects Entier ou Chaîne en Java. Nous pouvons les utiliser pour transférer des données entre des couches logicielles. Si les couches logicielles ou les services s’exécutent dans des nœuds distants différents, comme dans un environnement de 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 systèmes Java Enterprise Systems existants, les DTO peuvent contenir différents éléments EJB.

Je ne sais pas si c’est une bonne pratique ou non mais j’utilise personnellement des objects de valeur dans mes projets Spring MVC / Boot comme ceci:

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

La couche contrôleur ne sait pas quelles sont les entités. Il communique avec les objects Form et View Value . Les objects de formulaire ont des annotations de validation JSR 303 (par exemple @NotNull) et les objects de valeur d' affichage ont des annotations Jackson pour une sérialisation personnalisée. (par exemple @JsonIgnore)

La couche de service communique avec la couche de référentiel via des objects d'entité. Les objects d'entité comportent des annotations JPA / Hibernate / Spring Data. Chaque couche ne communique qu'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. Les référentiels peuvent donc renvoyer des objects View directement. Là, vous n'avez pas besoin d'une transformation supplémentaire.

Par exemple, ceci est notre entité utilisateur:

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

Mais vous devez renvoyer une liste d'utilisateurs paginés qui incluent simplement l'ID, le prénom, le nom de famille. Vous pouvez ensuite créer un object de valeur de vue pour la projection ORM.

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

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

 List find(Pageable pageable); 

Ne vous inquiétez pas pour les autres opérations de conversion BeanUtils.copy méthode BeanUtils.copy fonctionne BeanUtils.copy .

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

De Wikipedia :

L’object de transfert de données (DTO), anciennement connu sous le nom d’objects de valeur ou VO, est un modèle de conception utilisé pour transférer des données entre des sous-systèmes d’application logicielle. Les DTO sont souvent utilisés conjointement avec des objects d’access aux données pour extraire des données d’une firebase database.

1) Pour moi, la meilleure réponse à la question de savoir ce qu’est un DTO est que les DTO sont des objects simples qui ne doivent contenir aucune logique métier ni aucune implémentation de méthodes nécessitant des tests.

2) Normalement, votre modèle (utilisant le modèle MVC) sont des modèles intelligents, et ils peuvent contenir beaucoup de méthodes qui effectuent des opérations différentes pour ce modèle en particulier (et non la logique métier, cela devrait être aux contrôleurs). Cependant, lorsque vous transférez des données (par exemple, en appelant un sharepoint terminaison REST (GET / POST / any) ou en utilisant un service Web en utilisant soa, etc.), vous ne voulez pas transmettre l’object de grande taille avec un code qui n’est pas nécessaire pour le point d’extrémité, consumra des données et ralentira le transfert.

Les DTO existent face aux idées reçues de DonotRepeatYourself. Soyez très prudent et soyez absolument sûr que vous avez besoin d’un DTO