2009-11-09 12 views
1

Il y a eu une discussion très intéressante sur LosTechies regarding AutoMapper(an argument for/against 2-way mapping).DTO/Motif Commande Question

Ce fait a attiré mon attention en raison du problème que je travaille actuellement à travers. Je travaille sur une pièce d'expédition pour fournir des informations telles que les tarifs/délais de livraison à mes utilisateurs. Pour centraliser les services réels, j'ai un service Web WCF qui persiste toutes les entités de domaine.

Pour simplifier le modèle de domaine que j'ai essentiellement 2 classes:

public class Shipment 
{ 
public IList<Item> Items{get;set;} 
} 

public class Item 
{ 
//some primitive properties 
} 

J'ai aussi un ensemble correspondant de DTO qui ont été créés pour alléger la charge sur le fil. La pièce de présentation (ou pièces, tout ce qui touche au service web), utilise les DTO sans aucune connaissance du modèle de domaine.

Ma question arrive ici. Pour créer un envoi, le service accepte une liste d'articles. Il est logique de créer des envois, qui sont tous cachés derrière le service Web. Essentiellement, cela signifie que ItemDTO est passé à travers le fil (client -> serveur), les envois sont créés, puis ShipmentDTO est renvoyé (serveur -> client). Dorénavant, ShipmentDTO a également une liste enfant de ItemDTO, ce qui crée le scénario de mappage bidirectionnel.

Ceci est plus qu'une simple opération CRUD et je suis très nouveau dans le modèle de message de commande, donc je suis curieux de savoir comment la communauté pourrait résoudre ce problème.

Passez-vous un DTO dans les deux sens avec un mappage bidirectionnel?

Exemple d'utilisation (couche de présentation):

List<ItemDTO> list = new List<ItemDTO>(); 
//add items to list 


ShipmentServiceClient client = new ShipmentServiceClient(); 
List<ShipmentDTO> shipments = client.GetShipments(list); 

//shipments are now displayed to the user 
//with respective costs and other useful data 

Répondre

1

Quelque chose qui a été mentionné dans ce post que je n'ai pas bien compris était le libellé d'une réponse. "Les DTO entrants sont mappés aux messages de commande". En d'autres termes, les DTO peuvent être bidirectionnels, mais les mappages (AutoMapper) fournis sont unidirectionnels.

0

Au risque de manquer le point de votre question, je dirai qu'il est correct d'utiliser un DTO bi-directionnellement, tant que vous êtes ne pas réutiliser le DTO pour une mauvaise raison. Dans votre cas, est-ce la demande au serveur de créer un envoi pour un tas d'éléments remplissant chaque ItemDTO, de sorte que lorsque le serveur le récupère, les ItemDTO sont fondamentalement les mêmes? Ou, demandez-vous vraiment d'expédier plusieurs articles, mais le ItemDTO qui revient a des détails supplémentaires remplis par le serveur (par exemple, le coût d'expédition par article, l'état de l'inventaire, etc.)? Dans ce dernier cas, je dirais que vous ne devez pas réutiliser ItemDTO pour représenter à la fois un article particulier demandé pour l'expédition et les détails d'expédition d'un article.

+0

Le ItemDTO est réellement rempli (ou choisi) par le client. Le ShipmentDTO est ce qui porte coût, etc et est peuplé par le serveur. Mes problèmes ont résulté de la discussion AutoMapper, où il semble être la meilleure pratique d'utiliser la cartographie à sens unique, car il y a toujours un moyen de ne pas insituer quelque chose de bidirectionnel. –