J'ai lutté avec cela moi-même. Il y a des cas où un DTO a du sens à utiliser dans la présentation. Disons que je veux afficher une liste déroulante d'entreprises dans mon système et que j'ai besoin de leur identifiant pour lier la valeur.
Eh bien, au lieu de charger un CompanyObject qui pourrait avoir des références à des abonnements ou qui sait quoi d'autre, je pourrais renvoyer un DTO avec le nom et l'identifiant. Ceci est une bonne utilisation à mon humble avis.
Prenons maintenant un autre exemple. J'ai un objet qui représente une estimation, cette estimation peut être composée de main-d'œuvre, d'équipement, etc. des calculs). Pourquoi devrais-je modéliser cet objet deux fois? Pourquoi ne puis-je pas simplement faire énumérer mon interface utilisateur sur les calculs et les afficher?
Je n'utilise généralement pas de DTO pour isoler ma couche de domaine de mon interface utilisateur. Je les utilise pour isoler ma couche de domaine d'une limite qui est hors de mon contrôle. L'idée que quelqu'un mettrait des informations de navigation dans son objet métier est ridicule, ne contaminez pas votre objet métier.
L'idée que quelqu'un mettrait la validation dans son objet métier? Eh bien, je dis que c'est une bonne chose. Votre interface utilisateur ne devrait pas avoir la responsabilité exclusive de valider vos objets métier. Votre couche métier DOIT faire sa propre validation.
Pourquoi mettriez-vous du code de génération d'interface utilisateur dans un objet busienss? Dans mon cas, j'ai des objets séparés qui génèrent le code de l'interface utilisateur séparément de l'interface utilisateur. J'ai des objets sperate qui rendent mes objets métier en Xml, l'idée que vous devez séparer vos couches pour éviter ce type de contamination m'est si étrangère car pourquoi mettriez-vous même du code de génération HTML dans un objet métier ...
Edit
Comme je pense un peu plus, il y a des cas où les informations de l'interface utilisateur peuvent appartenir à la couche de domaine. Et cela pourrait brouiller ce que vous appelez une couche de domaine, mais j'ai travaillé sur une application multi-locataire, qui avait un comportement très différent à la fois l'apparence de l'interface utilisateur et le flux de travail fonctionnel. En fonction de divers facteurs. Dans ce cas, nous avions un modèle de domaine qui représentait les locataires et leur configuration. Leur configuration comprenait des informations d'interface utilisateur (des étiquettes pour les champs génériques par exemple).
Si je devais concevoir mes objets pour les rendre persistants, devrais-je également dupliquer les objets? Gardez à l'esprit que si vous souhaitez ajouter un nouveau champ maintenant, vous avez deux emplacements pour l'ajouter. Cela soulève peut-être une autre question si vous utilisez DDD, toutes les entités persistantes sont-elles des objets de domaine? Je sais dans mon exemple qu'ils l'étaient.