Je voudrais poser à nouveau cette question dans le contexte des microservices. Voici la citation de la question d'origine.
Je suis en train de créer une API REST pour un projet et j'ai lu article après article sur les meilleures pratiques. Beaucoup semblent être contre les DTO et exposent simplement le modèle de domaine, tandis que d'autres semblent penser que les DTO (ou les modèles utilisateur ou tout ce que vous voulez appeler) sont de mauvaises pratiques. Personnellement, je pensais que cet article avait beaucoup de sens.
Cependant, je comprends également les inconvénients des DTO avec tout le code de mappage supplémentaire, des modèles de domaine qui pourraient être 100% identiques à leur homologue DTO, etc.
Je suis plus aligné sur l'utilisation d'un objet à travers toutes les couches de mon application (en d'autres termes, il suffit d'exposer l'objet de domaine plutôt que de créer DTO et de copier manuellement sur chaque champ). Et les différences dans mon contrat par rapport au code peuvent être corrigées en utilisant des annotations Jackson comme @JsonIgnore
Ou @JsonProperty(access = Access.WRITE_ONLY)
ou @JsonView
Etc.). Ou s'il y a un ou deux champs qui nécessitent une transformation qui ne peut pas être effectuée à l'aide de Jackson Annotation, alors j'écrirai une logique personnalisée pour gérer exactement cela (croyez-moi, je n'ai pas rencontré ce scénario pas même une fois dans mes 5 ans et plus) long voyage dans les services de repos)
Je voudrais savoir si je manque de vrais effets négatifs pour ne pas copier le domaine vers DTO
mybatis.configuration.map-underscore-to-camel-case: true
, spring.jackson.property-naming-strategy: SNAKE_CASE
Petite histoire, au moins dans mon cas, les inconvénients ne l'emportent pas sur les avantages, donc cela n'a aucun sens de me répéter en ayant un nouveau POJO comme DTO. Moins de code, moins de risques de bugs. Donc, aller de l'avant avec l'exposition de l'objet Domain et ne pas avoir d'objet "view" séparé.
Clause de non-responsabilité: Cela peut ou non s'appliquer à votre cas d'utilisation. Cette observation est selon mon cas d'utilisation (essentiellement une API CRUD ayant 15 points d'extrémité)
Je voterais pour l'utilisation des DTO et voici pourquoi:
La décision est beaucoup plus simple si vous utilisez CQRS car:
Commands
qui sont déjà des DTO; Aggregates
- les objets à comportement riche de votre couche de domaine - ne sont pas exposés/interrogés, il n'y a donc aucun problème.readmodel
pour chaque cas d'utilisation. Dans le pire des cas, vous pouvez utiliser quelque chose comme GraphQL pour sélectionner uniquement les champs dont vous avez besoin.Si vous ne divisez pas la lecture de l'écriture, la décision est plus difficile à prendre car il existe des compromis dans les deux solutions.