Selon l'approche traditionnelle ou de la théorie sage, ViewModel devrait être une partie de la couche d'interface Utilisateur. Au moins le nom le dit.
Mais lorsque vous descendez à la mise en œuvre de soi-même, avec l'Entity Framework MVC, Dépôt, etc, alors vous réalisez quelque chose d'autre.
Quelqu'un a à la carte des Modèles d'Entité avec Viewmodel(DTO mentionné à la fin). Cela doit être fait dans A) la couche d'INTERFACE utilisateur (par le Contrôleur), ou B) de la couche de Service?
Je pars avec l'Option B. l'Option A est un pas à cause du simple fait que plusieurs des modèles d'entité se combinent pour former un ViewModel. Nous ne pouvons pas transmettre les données à la couche d'INTERFACE utilisateur, alors que dans l'option B, le service peut jouer avec les données et les transmettre que le nécessaire/minimum de la couche d'INTERFACE utilisateur après la cartographie (pour le ViewModel).
Encore une fois, nous supposons que nous mettre ViewModel dans la couche d'INTERFACE utilisateur(et le modèle d'entité dans la couche de Service).
Si la couche de Service des besoins à la carte pour le ViewModel, puis la couche de Service nécessaire à l'accès ViewModel dans la couche d'INTERFACE utilisateur. Bibliothèque/projet? Ce Dernier devrait être dans un autre projet dans la couche d'INTERFACE utilisateur, et ce projet doit être référencé par la Couche de Service. Si ce Dernier n'est pas dans un projet distinct, alors il y a de la circulaire de référence, donc pas aller. Il a l'air gêné d'avoir de la couche de Service d'accéder couche d'INTERFACE utilisateur, mais encore nous avons pu faire face avec elle.
Mais que faire si il y a une autre INTERFACE utilisateur de l'app à l'aide de ce service? Que faire si il n'y est une application mobile? Quelle différence peut le ViewModel être? Si le Service d'accès le même point de vue, le modèle de projet? Va toute l'INTERFACE utilisateur de projets d'accéder à la même ViewModel projet ou ils ont leur propre?
Après ces considérations, ma réponse serait de mettre le Viewmodel de projet dans la Couche de Service. Chaque couche d'INTERFACE utilisateur a accès à la couche de Service de toute façon! Et il pourrait y avoir beaucoup de semblables Viewmodel que tous puissent utiliser (d'où la cartographie devient plus facile pour la couche de service). Les mappages sont effectuées grâce à linq ces jours, ce qui est un autre atout.
Enfin il y a cette discussion sur la DTO. Et aussi sur l'annotation de données dans le Viewmodel. Viewmodel avec annotations de données ne peuvent pas résider dans la couche de service. Afin de lire DTO comme ViewModel, car pour la plupart il y en aura un sur la mise en correspondance entre les deux(avec AutoMapper). Nouveau DTO a encore de la logique nécessaire pour l'INTERFACE utilisateur(ou plusieurs applications) et réside dans la Couche de Service. Et la couche d'INTERFACE utilisateur ViewModel est juste pour copier les données à partir de DTO, avec quelques "comportement" a été ajoutée.
Bien que n'étant pas directement liées à la question. 'ViewModel Façade, mentionnés dans le présent doit regarder canal 9 lien est également intéressant à étudier. Il commence exactement à 11 minutes 49 secondes dans la vidéo.
Également dans votre exemple "_repository.ListContacts()" est de retour d'un viewmodel de référentiel. Ce n'est pas une manière mature. Les référentiels doivent fournir des modèles d'entité ou db modèles. Ce est converti les modèles de vue et c'est ce modèle de vue qui est retourné par le service de la couche.