2011-03-22 1 views
4

J'ai un EmployeeDTO qui représente un enregistrement Employé dans la base de données. La table Employee a une relation avec un département et une relation 1-to-many avec l'autorisation.Les propriétés de l'objet de transfert de données doivent-elles développer les clés étrangères ou simplement exposer leurs clés primaires?

Dans mes entités, elles sont représentées comme une propriété Département entièrement développée et une liste d'objets d'autorisation entièrement développés.

La question est de savoir si le DTO doit posséder une propriété DepartmentDTO entièrement développée d'un DepartmentId? Le DTO devrait-il avoir une liste des propriétés PermissionDTO complètement étendues de List of PermissionId?

Répondre

3

Comme tout dans le design, cela dépend de vos besoins.

  • Si vous avez besoin de voir fréquemment et se lient aux propriétés de l'enfant et que vous voulez pour le rendre aussi facile que possible pour aux développeurs d'utiliser vos DTO, vous pouvez voulez des méthodes d'usine explicites pour donner vous complètement décompressé propriétés de l'enfant.
  • Si vous voulez la simplicité du code, ne pas élargir les propriétés clés étrangères et simplement permettre aux développeurs amener l'enfant objet/collections qu'ils veulent par clé au besoin.

Vous pouvez rencontrer des problèmes de récursivité; étendez-vous également toutes les propriétés de clé étrangère de l'objet Département? Que faire s'il y a une référence à un autre EmployeeDTO dans une sous-classe de Department?

Entity Framework de Microsoft, ainsi que d'autres frameworks d'objets métier populaires, gèrent ce concept par chargement paresseux - ne récupèrent la propriété enfant développée complète que si le code le demande. C'est probablement la solution la plus flexible, mais il y a un peu de temps système car les propriétés enfants ne peuvent pas être récupérées dans le même appel de base de données que l'objet parent. Ce ne sont bien sûr pas de simples DTO.

+1

Oui, comment gérez-vous le problème de récursivité si vous voulez des propriétés enfants entièrement développées? Si les DTO se réfèrent l'un à l'autre, alors vous continuerez à vous développer pendant longtemps. Donc, lorsque j'écris ma classe DTO, je ne stocke que l'identifiant unique des autres DTO et non l'intégralité de l'autre DTO lui-même? – user798719

2

Oui et Non. Cela dépend de l'appel et si vous avez besoin de toutes les propriétés supplémentaires dans chaque appel. Cela peut aussi dépendre de la technologie ORM que vous utilisez qui peut implémenter un chargement paresseux et qui peut affecter votre décision (si vous passez des objets entité droits bien que ce soit non recommandé).

Il est courant de créer un cas DTO contenant toutes les propriétés nécessaires et un ou plusieurs objets DTO qui exposent plus de fonctionnalités et utilisent d'autres méthodes. Par exemple, j'ai une classe BasicUser qui contient seulement UserName et DisplayName et j'ai User qui contient plus compris Permissions et hérite de `BasicUser.

Questions connexes