Question

Je l'ai vu beaucoup de questions liées à la cartographie DTO aux objets de domaine, mais Je ne me sentais pas ils ont répondu à ma question. Je l'ai utilisé plusieurs méthodes avant et avoir mes propres opinions, mais je cherche quelque chose d'un peu plus concret.

La situation:

Nous avons de nombreux objets de domaine. Nous utilisons un modèle AAPC afin que nos objets de domaine peuvent être assez complexes et contiennent leur propre accès aux données. Vous ne voulez pas passer ceux-ci autour du fil. Nous allons écrire de nouveaux services qui redonneront des données dans un certain nombre de formats (.Net, JSON, etc.). Pour cela (et d'autres raisons), nous créons aussi un maigre, objet de transfert de données à passer autour du fil.

Ma question est: Comment les DTO et objets de domaine sont connectés

Ma première réaction consiste à utiliser un Fowler, solution de type de motif DTO . Je l'ai vu cela plusieurs fois fait et il se sent bien à moi. L'objet de domaine ne contient aucune référence à la DTO. Une entité extérieure (un « cartographe » ou « assembleur ») est appelé à créer un DTO à partir d'un objet de domaine. Normalement, il y a une ORM sur le côté objet de domaine. L'inconvénient est que le « cartographe » tend à devenir extrêmement complexe pour toute situation réelle et peut être très fragile.

Une autre idée avancée est pour l'objet Domaine de « contenir » la DTO, car il est juste un objet de données maigre. Les propriétés de l'objet de domaine renverrait en interne les propriétés DTO et pourraient tout simplement retourner le DTO si demandé. Je ne vois aucun problème avec cela, mais il se sent mal. J'ai vu quelques articles où les gens en utilisant NHibernate semblaient utiliser cette méthode.

Y at-il d'autres moyens? Est l'un des moyens ci-dessus en utilisant une valeur? Si oui ou si non, pourquoi?

Était-ce utile?

La solution

Un avantage d'avoir un mappeur qui se trouve entre votre domaine et votre DTO est pas aussi apparents, lorsque vous qu'appuyer une application unique, mais comme le nombre d'applications augmente, ayant ce code isolé du domaine permet de garder le domaine plus simple et plus maigres. Vous ne serez pas encombrer votre domaine avec beaucoup de poids supplémentaire.

Personnellement, j'essaie de garder la mise en correspondance de mes entités de domaine et de mettre la responsabilité dans ce que j'appelle « couche Directeur / Service ». Ceci est une couche qui se trouve entre l'application et la respository (s), et fournit la logique métier, comme la coordination des flux de travail (si vous modifiez un, vous pourriez avoir à modifier aussi B pour le service A travaillera avec le Service B).

Si j'avais beaucoup de formats de fin possible, je pourrais envisager la création d'un formatter embrochable qui pourrait utiliser le modèle des visiteurs, par exemple pour transformer mes entités, mais je ne l'ai pas trouvé un besoin encore pour tout ce complexe.

Autres conseils

Vous pouvez utiliser un automapper comme celui écrit par Jimmy Bogard qui n'a aucun lien entre les objets et repose sur les conventions de nommage sont respectées.

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

de Pro - un code lisible humain disponible au moment de la compilation, plus rapide qu'un mappeur d'exécution. le contrôle à 100% par rapport au code (peut utiliser des méthodes motif partiel / matrice pour étendre la fonctionnalité sur une base ad hoc)

Con -. Excluant certaines propriétés, des collections d'objets de domaine etc., l'apprentissage syntaxe T4

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

Caractéristiques:

  • mappage bidirectionnel
  • mapping automatique
  • Cartographie entre les différents types
  • mappage imbriqué et aplatissement
  • Listes et tableaux
  • Vérification des relations
  • Test de la cartographie
  • Propriétés, champs et méthodes

Comment voyez-vous pour mettre en œuvre un constructeur dans la classe DTO qui prend comme paramètre un objet de domaine?

Dis ... Quelque chose comme ceci

class DTO {

     // attributes 

     public DTO (DomainObject domainObject) {
          this.prop = domainObject.getProp();
     }

     // methods
}

Vous pouvez également essayer Otis, un objet-objet mappeur. Les concepts sont similaires à la cartographie NHibernate (attribut ou XML).

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

Je peux suggérer un outil que j'ai créé et est open source hébergé à CodePlex. EntitiesToDTOs

Correspondance de DTO à l'entité et vice-versa est mis en oeuvre par les méthodes d'extension, ceux-ci forment le côté Assembleur de chaque extrémité.

Vous finissez avec le code suivant:

Foo entity = new Foo();
FooDTO dto = entity.ToDTO();
entity = dto.ToEntity();

List<Foo> entityList = new List<Foo>();
List<FooDTO> dtoList = entityList.ToDTOs();
entityList = dtoList.ToEntities();

Pourquoi ne pas nous pouvons faire comme ça?

class UserDTO {
}

class AdminDTO {
}

class DomainObject {

 // attributes
 public DomainObject(DTO dto) {
      this.dto = dto;
 }     

 // methods
 public function isActive() {
      return (this.dto.getStatus() == 'ACTIVE')
 }

 public function isModeratorAdmin() {
      return (this.dto.getAdminRole() == 'moderator')
 }

}


userdto = new UserDTO();
userdto.setStatus('ACTIVE');

obj = new DomainObject(userdto)
if(obj.isActive()) {
   //print active
}

admindto = new AdminDTO();
admindto.setAdminRole('moderator');

obj = new DomainObject(admindto)
if(obj.isModeratorAdmin()) {
   //print some thing
}

@FrederikPrijck (ou) une personne: S'il vous plaît suggérer. Dans l'exemple ci-dessus est DomainObject dépend de DTO. De cette manière je peux éviter le code pour faire la cartographie de la DTO <->. Domainobject

ou DomainObject peut classe étend la classe DTO?

Une autre option serait d'utiliser ModelProjector . Il prend en charge tous les scénarios possibles et il est très facile à utiliser avec encombrement minimal.

Nous pouvons utiliser Factory, Memento et modèle Builder pour cela. Usine cacher les détails sur la façon de créer une instance de modèle de domaine de DTO. Memento prendra soin la sérialisation / désérialisation du modèle de domaine / de DTO et peut même accéder aux membres privés. La volonté Builder permet la cartographie de DTO domaine avec interface fluide.

Garder la logique de la cartographie à l'intérieur de votre entité signifie que votre objet de domaine est maintenant au courant d'un « détail de mise en œuvre » qu'il n'a pas besoin de savoir. En général, un DTO est votre passerelle vers le monde extérieur (soit à partir d'une requête entrante ou par une lecture d'un service / base de données externe). Étant donné que l'entité fait partie de votre logique d'affaires, il est probablement préférable de garder ces détails à l'extérieur de l'entité.

Garder la cartographie ailleurs serait la seule alternative - mais où faut-il aller? J'ai essayé l'introduction d'objets / services de cartographie, mais, après tout a été dit et fait, il semblait que overengineering (et probablement était). J'ai eu un certain succès en utilisant Automapper et comme pour les petits projets, mais des outils comme Automapper viennent avec leurs propres pièges. J'ai eu quelques assez difficile de trouver des problèmes liés aux applications, car les correspondances de Automapper sont implicites et complètement découplé du reste de votre code (pas comme « la séparation des préoccupations », mais plus comme un « où le mapping godforsaken en direct ») afin qu'ils peut parfois être difficile à trouver. Pour ne pas dire que Automapper n'a pas ses utilisations, parce qu'il fait. Je pense que la cartographie doit être quelque chose qui est aussi évidente et transparente que possible pour éviter les problèmes.

Au lieu de créer une couche de service de cartographie, j'ai eu beaucoup de succès en gardant mes correspondances à l'intérieur de mes DTO. Depuis DTO assis alway à la limite de l'application, ils peuvent être informés de l'objet métier et comprendre comment la carte de / vers eux. Même lorsque le nombre de correspondances échelle à un montant raisonnable, il fonctionne proprement. Toutes les correspondances sont en un seul endroit et vous n'avez pas à gérer un groupe de services de cartographie à l'intérieur de votre couche de données, couche anti-corruption, ou la couche de présentation. Au lieu de cela, la mise en correspondance est juste un détail de mise en œuvre déléguée au DTO impliqué dans la demande / réponse. Depuis serializers généralement que sérialisent propriétés et champs lorsque vous l'envoyez à travers le fil, vous ne devriez pas avoir de problèmes. Personnellement, je l'ai trouvé ce l'option la plus propre et je peux dire, dans mon expérience, il monte bien sur une grande base de code.

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