Question

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

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

Était-ce utile?

La solution

Un objet de transfert de données est un objet utilisé pour encapsuler des données et les envoyer d'un sous-système à un 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 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 être d'encapsuler des 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 inversement.

La conversion d'objet de domaine en DTO et vice-versa peut être un processus coûteux. Si vous ne créez pas d'application distribuée, le modèle ne vous apportera probablement aucun avantage, comme Martin Fowler explique ici

Autres conseils

La définition de DTO est disponible sur le le 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. De nombreuses personnes utilisent celles 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 accesseurs, mais aucune autre logique d’importance (autre que 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) soient des DTO ou des collections / agrégats de DTO

En général, les objets de valeur doivent être immuables. Comme les objets Integer ou 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 microservices ou dans une application Java Enterprise existante. 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 anciens DTO de Java Enterprise Systems, il est possible d’utiliser divers éléments EJB.

Je ne sais pas s'il s'agit d'une pratique recommandée ou non, mais j'utilise personnellement les objets de valeur dans mes projets Spring MVC / Boot comme suit:

        |------------|         |------------------|                             |------------|
-> 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 formulaires et les objets de valeur . 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 une 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 les couches est interdite en raison de la dépendance circulaire / cyclique.

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

Certains cadres ORM peuvent effectuer des projections via des interfaces ou des 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, il s’agit de 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 ...
}

Cependant, vous devriez renvoyer une liste d'utilisateurs paginée comprenant uniquement l'id, le prénom et le nom de famille. Vous pouvez ensuite créer un objet View Value 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é depuis la couche 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 correctement.

  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 doivent contenir aucune implémentation de logique métier ou de méthodes exiger des tests .
  2. Normalement, vos modèles (utilisant le modèle MVC) sont des modèles intelligents. Ils peuvent contenir un grand nombre de méthodes permettant d'effectuer certaines opérations spécifiques à ce modèle (pas la logique métier, cela devrait se faire sur les contrôleurs). Toutefois, lorsque vous transférez des données (par exemple, en appelant un noeud final REST (GET / POST / quel que soit), ou en consommant un service Web à l'aide de SOA, etc.), vous ne souhaitez pas transmettre l'objet de grande taille avec code qui n'est pas nécessaire pour le terminal, consomme des données et ralentit le transfert.

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.

De Wikipedia :

  

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top