2

Ou devraient-ils être dans la couche supérieure (interface utilisateur client)? Lorsque j'utilise une architecture d'oignon (ASP.Net MVC), est-ce que je devrais mettre mes modèles de vue avec toutes mes entités de domaine au cœur. Juste comme dans l'image ci-dessous? Ma question est - si oui alors quand je passe un modèle de vue de mon service à mon client, n'est pas le client (couche supérieure) dépendant de la couche de base, qui est deux couches vers le bas et ne serait pas briser l'ensemble de la dépendance avec chaque couche seulement parler à la couche ci-dessous? Que se passe-t-il lorsque j'ai un viewmodel (dans la couche de présentation) qui doit référencer une entité dans la couche domaine (deux couches plus bas), cela ne rompt pas l'architecture oion de référencer seulement la couche directement ci-dessous.Est-ce que mes modèles de vue doivent être avec mes entités de domaine au cœur d'une architecture d'oignon?

public class YogaSpaceListViewModel 
{ 
    // YogaSpaceResults is in the domain layer two layers down 
    public IPagedList<YogaSpaceResults> YogaSpaces { get; set; } 

    public string LocationResults { get; set; } 
} 


// this is in the domain layer with all my other entities 
// this is being filled by entity framework in the DAL, which I'm calling from the service layer. 
public class YogaSpaceResults 
{ 
    public string Title { get; set; } 
    public string Summary { get; set; } 
    public DateTime Date { get; set; } 
    public DbGeography LocationPoints { get; set; } 
} 

enter image description here

+1

IMHO, voir le modèle appartient à la vue. Chaque interface utilisateur aura un ensemble différent de modèles de vue. Parfois, ils peuvent être similaires au modèle de domaine, mais alors qu'un modèle de domaine représente un concept, le modèle de vue est juste un DTO à l'interface utilisateur. –

Répondre

0

Il fonctionne de l'extérieur vers l'intérieur de sorte, le client sait sur les services non viceversa, Services connaît modèle de domaine non viceversa.

Donc, vous avez raison si vous mettez vos ViewModels du côté client, comment les Services le sauraient-ils? Eh bien ... dans ce contexte, vous parlez des services d'application et non des services de domaine car ceux-ci servent au modèle de domaine en utilisant le langage omniprésent et ViewModels ne devrait pas en faire partie. Les services d'application doivent être dans la couche d'application qui se trouve entre le modèle client et le modèle de domaine, ils peuvent coordonner les opérations entre d'autres services et des référentiels. Thats pourquoi je dirais que votre ViewModels devrait être dans la couche d'application.

+0

Ok, c'est l'hypothèse que je vais faire aussi, basé sur votre réponse et ce lien http://stackoverflow.com/questions/15531846/what-is-the-best-way-to-build-view-model. MAIS, qu'en est-il un viewmodel qui a une entité de domaine en elle? Code collé ci-dessus. Maintenant, ma couche d'application (couche supérieure) doit faire référence à la couche de domaine qui est deux couches plus bas. Est-ce que ça va ou est-ce que je peux seulement avoir accès au calque directement en dessous de moi? – user1186050

+0

Non, le modèle ** View ** (indice !!) appartient à l'interface utilisateur. La couche d'application qui n'a de sens que lors de la mise à jour du modèle (pas pour les requêtes), connaît le résultat de l'opération qui peut être utilisé comme modèle de vue ou comme base pour un modèle de vue, et c'est le travail du contrôleur. – MikeSW

+0

@ user1186050 Votre modèle de vue ne doit pas contenir d'entité de domaine. Si c'est le cas, c'est une mauvaise conception ou vous avez une application CRUD et les choses sont beaucoup plus simples alors. – MikeSW

1

En fonction de la publication mise à jour, vous demandez essentiellement un scénario de requête. Tout d'abord, vous devez être très clair sur le type d'opération que vous effectuez: une commande (modèle de mise à jour) ou une requête (modèle de lecture). Chaque cas a ses propres spécificités et peut être optimisé sous une forme maintenable. Dans ce cas précis, la requête, les choses sont très simples: le contrôleur doit appeler un service de requête (aka gestionnaire de requête), similaire à un service d'application mais à des fins d'interrogation, qui obtiendra les données de persistance dans le désiré forme. Notez que dans une application DDD/CQRS, la superposition est secondaire à la découpe verticale des composants alias. Cela signifie que votre persistance connaît votre modèle de vue et que le gestionnaire de requêtes renvoie le modèle de vue directement à partir de la base de données, aucune entité de domaine n'est impliquée. En résumé, à des fins d'interrogation, l'interface utilisateur parle directement de la persistance en ignorant le domaine.