90 votes

Meilleures pratiques pour mapper DTO à un objet de domaine?

J'ai vu un tas de questions relatives à la cartographie des Otd à des Objets du Domaine, mais je n'ai pas l'impression d'avoir répondu à ma question. J'ai utilisé de nombreuses méthodes d'avant et d'avoir mon propre avis, mais je suis à la recherche de quelque chose d'un peu plus concret.

La Situation:

Nous avons de nombreux objets de domaine. Nous sommes à l'aide d'un AAPC modèle, de sorte que nos objets de domaine peut être assez complexe et elles contiennent leur propre accès aux données. Vous ne souhaitez pas passer ces derniers autour de sur le fil. Nous allons écrire des nouveaux services de données de retour dans un certain nombre de formats (.Net, JSON, etc.). Pour cela (et pour d'autres raisons) nous sommes également à la création d'un maigre, objet de transfert de données pour passer sur le fil.

Ma question est comment la DTO de Domaine et objet connecté?

Ma première réaction est d'utiliser un Fowler, DTO modèle-type de solution. J'ai vu que cela fait de nombreuses fois et il se sent le droit pour moi. L'objet de domaine ne contient aucune référence à la DTO. Une entité extérieure (un "mapper" ou "assembleur") est appelé à créer un DTO à partir d'un Objet du Domaine. Normalement il y a un ORM sur l'objet du domaine côté. L'inconvénient de cette est que le "mapper" tend à devenir extrêmement complexe pour toute situation réelle, et peut être très fragile.

Une autre idée a mis en avant pour le Domaine de l'Objet pour "contenir" la DTO, puisque c'est juste un maigre objet de données. Le Domaine des propriétés de l'Objet serait à l'interne de référence de la DTO des propriétés et pourrait juste retour de la DTO si demandé. Je vois pas de problèmes avec cela, mais il se sent mal. J'ai vu quelques articles où les gens à l'aide de NHibernate est apparu à utiliser cette méthode.

Il existe d'autres moyens? Est l'un des moyens ci-dessus mérite l'aide? Si oui ou si non, pourquoi?

Merci pour toute la perspicacité à l'avance.

43voto

JoshBerke Points 34238

Un avantage d'avoir un mappeur qui se trouve entre votre nom de domaine et votre DTO n'est pas comme appearent lorsque vous ne supportant une seule cartographie, mais comme le nombre de correspondances augmente, ayant le code isolé à partir du domaine permet de garder le domaine plus simple et plus maigre. Vous ne serez pas encombrer votre domaine avec beaucoup de poids supplémentaire.

Personnellement, j'essaie de garder la cartographie de mon domaine d'entités et de la responsabilité dans ce que j'appelle "Gestionnaire / couche de Service". C'est une couche qui se trouve entre l'application et le respository(s), et fournit une logique d'entreprise tels que les flux de travail de la coordination (Si vous modifiez Un, vous devrez également modifier B service d'une volonté de travailler avec le Service B).

Si j'ai eu beaucoup de fin possible formats, je pourrais chercher à créer un plugable formateur qui pourrait utiliser le modèle Visiteur, par exemple pour transformer mes entités, mais je n'en ai pas trouvé un besoin encore de quelque chose d'aussi complexe.

24voto

Garry Shutler Points 20898

Vous pouvez utiliser un automate tel que celui écrit par Jimmy Bogard, qui n’a aucun lien entre les objets et qui repose sur les conventions de dénomination.

7voto

Silverfox Points 124

Nous utilisons des modèles T4 pour créer les classes de mappage.

Pro's - code lisible par l'homme disponible au moment de la compilation, plus rapide qu'un mappeur d'exécution. Contrôle total du code (peut utiliser des méthodes partielles / un modèle pour étendre les fonctionnalités sur une base ad-hoc)

Con - exclut certaines propriétés, collections d'objets de domaine, etc., apprentissage de la syntaxe T4.

1voto

Saly Points 11

Une autre solution possible: http://glue.codeplex.com .

Caractéristiques:

  • Mappage bidirectionnel
  • Cartographie automatique
  • Cartographie entre différents types
  • Cartographie imbriquée et aplatissement
  • Listes et tableaux
  • Vérification des relations
  • Tester la cartographie
  • Propriétés, champs et méthodes

0voto

Brian Chavez Points 2507

Vous pouvez également essayer Otis, un mappeur d'objet à objet. Les concepts sont similaires au mappage NHibernate (attribut ou XML).

http://code.google.com/p/otis-lib/wiki/GettingStarted

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X