Qu'est-ce qu'un objet de transfert de données?
Dans MVC, les classes de modèle sont DTO, et si non, quelles sont les différences et avons-nous besoin des deux?
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 le plus souvent utilisés par la couche Services dans une application à plusieurs niveaux pour transférer des données entre elle et la couche UI. Le principal avantage ici est que cela réduit la quantité de données qui doit être transmise de bout en bout dans les applications distribuées. Ils font également d'excellents modèles dans le modèle MVC.
Une autre utilisation des DTO peut consister à encapsuler des paramètres pour les appels de méthodes. 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 inversement.
La conversion d'objet de domaine en objet DTO et inversement peut être un processus coûteux. Si vous ne créez pas d'application distribuée, vous ne tirerez probablement aucun avantage considérable du modèle, car Martin Fowler explique ici
La définition de DTO est disponible sur site de Martin Fowler . Les DTO sont utilisés pour transférer des paramètres vers des méthodes et en tant que types de retour. Beaucoup de gens utilisent ceux de l'interface utilisateur, mais d'autres en gonflent les objets de domaine.
Un DTO est un objet stupide - il ne contient que des propriétés, des accesseurs et des setters, mais aucune autre logique d’importance (à part peut-être une implémentation de compare () ou d’égal ()).
En règle générale, les classes de modèle dans MVC (en supposant que .net MVC dans ce cas) sont des DTO ou des collections/agrégats de DTO
En général objets de valeur devrait être immuable. Comme Entier ou objets String 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 sur différents nœuds distants, comme dans un environnement de microservices ou dans un environnement hérité Java Enterprise App. Nous devons faire des copies presque exactes de deux classes. C'est là que nous avons rencontré des DTO .
|-----------| |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------| |--------------|
Dans les versions antérieures Java), les systèmes d'entreprise concernés peuvent contenir divers éléments EJB.
Je ne sais pas si c'est une bonne pratique ou non, mais j'utilise personnellement objets de valeur dans mes projets Spring MVC/Boot comme ceci:
|------------| |------------------| |------------|
-> Form | | -> Form | | -> Entity | |
| Controller | | Service / Facade | | Repository |
<- View | | <- View | | <- Entity / Projection View | |
|------------| |------------------| |------------|
Contrôleur la couche ne sait pas quelles sont les entités. Il communique avec Form et View Value Objects. Les objets de formulaire ont des annotations de validation JSR 303 (par exemple, @NotNull) et View Value Objects ont des annotations de Jackson pour la sérialisation personnalisée. (par exemple @JsonIgnore)
La couche de service communique avec la couche de référentiel via des objets Entity. Les objets d'entité ont des annotations JPA/Hibernate/Spring Data. Chaque couche ne communique qu'avec la couche inférieure. La communication entre couches est interdite en raison de la dépendance circulaire/cyclique.
User Service ----> XX CANNOT CALL XX ----> Order Service
Certains ORM Les cadres ont la capacité de projection via l’utilisation d’interfaces ou de classes supplémentaires. Les référentiels peuvent donc renvoyer directement les objets View. Là, vous n'avez pas besoin d'une transformation supplémentaire.
Par exemple, ceci 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 d'utilisateurs paginée comprenant uniquement id, prénom, nom. Ensuite, vous pouvez créer un objet 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 les autres opérations de conversion BeanUtils.copy
La méthode fonctionne très bien.
GET
/POST
/quel que soit]), ou en consommant un service Web à l'aide de SOA, etc. ...) vous ne souhaitez pas transmettre l’objet volumineux avec un code inutile pour le terminal, consommer des données et ralentir le transfert.Avec MVC, les objets de transfert de données sont souvent utilisés pour mapper des modèles de domaine vers des objets plus simples qui seront finalement affichés par la vue.
De Wikipedia :
L'objet de transfert de données (DTO), anciennement objet 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 avec des objets d'accès aux données pour extraire des données d'une base de données.