Où pour convertir un DTO à ViewModel?
J'ai hérité d'un MVC2 projet à l'aide d'un assez standard et décemment bien gardé DDD modèle. J'ai fait beaucoup de lecture sur l'ensemble de la DTO/ViewModel débat ainsi.
Actuellement notre Otd sont souvent utilisés comme Viewmodel. Honnêtement ne pas faire une différence pour ce que nous faisons, mais j'aimerais utiliser de façon appropriée les ViewModels que nous mettons à jour le site.
Voici ma question:
Notre "domaine" du projet modèles détiennent actuellement les entités et retour Otd à mes contrôleurs. Maintenant, j'ai besoin de carte que DTO à un ViewModel. Où dois-je le faire?
- Droit dans le contrôleur?
- Dans le domaine du projet?
- Ailleurs?
Je vais garder mon Viewmodel aux côtés de la vue dans notre "Web" projet de sorte qu'il se sent mal à convertir DTO -> ViewModel dans le domaine du projet. Il se sent aussi mal à le faire dans le contrôleur.
Ce que d'autres ont-ils fait?
Edit:
Cette question/réponse suggère de le manipuler dans le contrôleur. C'est sûr qu'il devient facile de réfléchir à cela.
- Que voulez-vous dire DTO ici? est-ce que votre modèle de domaine?
- pour moi: DTO == "Objet de Transfert de Données" à la mode que la plupart des gens discuter de l'Otd dans le domaine de la .NET/Java et DDD. Je suis encore à apprendre tout cela, donc je ne sais pas quoi dire d'autre!
- J'ai encore de la confusion, je suppose DTO que vous mentionnez est l'ENTITÉ de DOMAINE? parce que DTO est lui-même "Objet de Transfert de Données" de travail dans la couche de Distribution. DTO et le Modèle de Vue est un peu le même niveau, si vous travaillez dans le service de la top modèle appelé DTO, si vous travaillez dans l'application, modèle haut de l'appeler Modèle de Vue
Vous devez vous connecter pour publier un commentaire.
Les dto sont généralement spécifiques à la technologie. Par exemple, dans le .NET monde votre les Dto sont susceptibles décorées avec
DataContract
etDataMember
attributs de la sérialisation. En outre, les Dto en collaboration avec le service qui les renvoie forme d'un adaptateur pour le domaine en termes de hexagonal architecture. Ils adapter votre domaine spécifique de la technologie de transport tels que HTTP et en tant que tels, ils vivent à l'extérieur de votre domaine. En d'autres termes, le domaine ne devrait pas avoir connaissance de l'Otd - les Dto doivent être définis dans un projet distinct. Le projet contenant le service doit mappage de code qui associe les objets du domaine de Dto.Un ASP.NET projet MVC est similaire dans la nature - il s'adapte votre service/Otd (ou d'objets de domaine directement) pour une présentation de la technologie, HTML en particulier. En tant que tel, l'Otd ne devrait pas être conscient du Viewmodel. Au lieu de cela, le MVC contrôleur doit invoquer le mappage entre les Dto et Viewmodel. Cela peut être fait dans une variété de façons, mais ce que j'ai trouvé le mieux est un constructeur du ViewModel acceptant un DTO. Aussi, dans les cas où l'action d'un contrôleur de bons de souscription de la création d'un DTO pour être envoyé vers le service, le ViewModel peut contenir une méthode pour la création de la DTO basé sur le ViewModel. Il contient tous les mappage de code dans le ViewModel plus proche du réel données d'une instance de la spécialiste de l'information de modèle. Une autre façon de mettre en œuvre ce serait d'utiliser quelque chose comme AutoMapper qui utilise la convention de mappage pour éviter de code réutilisable. En dehors de cela, je considère exagéré, sauf s'il est appelé pour.
Dans de nombreux cas, votre ViewModel finit par regarder juste comme la DTO, mais avec ASP.NET MVC attributs spécifiques pour la liaison et la validation. Même si cela peut sembler comme une violation de SEC, ce sont vraiment des responsabilités distinctes.
[DataMember]
sur elle, alors il n'est pas un DTO.Tout d'abord, utilisez toujours explicite Viewmodel pour votre point de Vue, ne passez pas à Otd tout le chemin jusqu'à la Vue. C'est un peu plus de travail en amont, mais il vous donne plus de contrôle sur exactement quelles sont les informations nécessaires dans la Vue (il empêche également d'un framework comme EF de sideloading beaucoup de données supplémentaires que vous pouvez ou ne pouvez pas utiliser)
Deuxièmement, cet article décrit les Orchestrator modèle http://www.simple-talk.com/dotnet/asp.net/never-mind-the-controller,-est-ici-la-orchestrator/ qui est probablement juste un autre nom pour un autre motif, mais j'aime bien le format.
Essentiellement, vous créez un Orchestrateur pour chaque Contrôleur. Le Orchestrator prend dans les données (généralement un ViewModel, et tous les autres types de données de base nécessaires, en particulier ceux de la HttpContext), et retourne un ViewModel (si nécessaire pour l'Afficher, sinon un autre type de retour).
Ce format vous donne l'avantage de pouvoir facilement de l'unité de test de la logique réelle sans avoir à les essayer pour se moquer de la HttpContext choses que les Contrôleurs ont besoin.
Sonne comme quelque chose que vous voulez faire dans la construction de la cartographie/module.
Je serais personnellement donner mon contrôleur d'une dépendance à un service de cartographie et puis délégué de la conversion réelle pour que, avant de retourner la vue avec de nouveaux mappé viewmodel.
Une bonne approche consiste à surcharger le constructeur de votre ViewModel avec un deuxième constructeur qui a le dto en tant que paramètre. Cela signifie que vous pouvez gérer la cartographie dans le Modèle de Vue lui-même. Cela garantit que votre contrôleur de nice et de rangement, sans avoir à mettre en place un service de cartographie.