Je (re) conçois des applications à grande échelle, nous utilisons une architecture multicouche basée sur DDD.
Nous avons MVC avec couche de données (implémentation de référentiels), couche de domaine (définition du modèle de domaine et interfaces - référentiels, services, unité de travail), couche de service (implémentation de services). Jusqu'à présent, nous utilisons des modèles de domaine (principalement des entités) sur toutes les couches, et nous utilisons les DTO uniquement comme modèles de vue (dans le contrôleur, le service renvoie le (s) modèle (s) de domaine et le contrôleur crée le modèle de vue, qui est passé à la vue).
J'ai lu d'innombrables articles sur l'utilisation, la non-utilisation, le mappage et la transmission des DTO. Je comprends qu'il n'y a pas de réponse définitive, mais je ne suis pas sûr que ce soit correct ou non de renvoyer les modèles de domaine des services aux contrôleurs. Si je retourne le modèle de domaine, il n'est toujours jamais passé à la vue, car le contrôleur crée toujours un modèle de vue spécifique à la vue - dans ce cas, cela semble légitime. D'un autre côté, cela ne se sent pas bien lorsque le modèle de domaine quitte la couche métier (couche de service). Parfois, le service doit renvoyer un objet de données qui n'a pas été défini dans le domaine, puis nous devons soit ajouter un nouvel objet au domaine qui n'est pas mappé, soit créer un objet POCO (c'est moche, car certains services renvoient des modèles de domaine, certains renvoyer effectivement les DTO).
La question est la suivante: si nous utilisons strictement des modèles de vue, est-il acceptable de renvoyer les modèles de domaine jusqu'aux contrôleurs, ou devrions-nous toujours utiliser les DTO pour la communication avec la couche de service? Si tel est le cas, est-il possible d'ajuster les modèles de domaine en fonction des besoins des services? (Franchement, je ne pense pas, car les services devraient consommer ce que le domaine a.) Si nous devons nous en tenir strictement aux DTO, devraient-ils être définis dans la couche de service? (Je pense que oui.) Parfois, il est clair que nous devrions utiliser des DTO (par exemple, lorsque le service exécute beaucoup de logique métier et crée de nouveaux objets), parfois il est clair que nous devrions utiliser uniquement des modèles de domaine (par exemple, lorsque le service Membership renvoie un utilisateur anémique ( s) - il semble que cela n'aurait pas beaucoup de sens de créer un DTO identique au modèle de domaine) - mais je préfère la cohérence et les bonnes pratiques.
Article Domain vs DTO vs ViewModel - Comment et quand les utiliser? (et aussi quelques autres articles) est très similaire à mon problème, mais il ne répond pas à cette (ces) question (s). Article Dois-je implémenter des DTO dans un modèle de référentiel avec EF? est également similaire, mais il ne traite pas de DDD.
Avertissement: Je n'ai pas l'intention d'utiliser un modèle de conception uniquement parce qu'il existe et est sophistiqué, d'un autre côté, j'aimerais utiliser de bons modèles et pratiques de conception également parce que cela aide à concevoir l'application dans son ensemble, aide à la séparation des préoccupations, même le fait d'utiliser un modèle particulier n'est pas "nécessaire", du moins pour le moment.
Comme toujours, merci.