MVC: Modèles de données et modèles de vue

J’ai lu des conseils MVC dans le passé concernant les modèles indiquant que vous ne devriez pas réutiliser les mêmes objects de modèle pour le domaine et la vue; mais je n’ai pas pu trouver quelqu’un disposé à discuter de la raison pour laquelle c’est mauvais.

À mon avis, la création de deux modèles distincts, l’un pour le domaine, l’autre pour la vue, puis leur mappage créent beaucoup de duplication, ainsi qu’un code de mappage fastidieux (dont certains pourraient être atténués par des choses comme AutoMapper ). être sujet aux erreurs.

Qu’est-ce qui fait que le fait d’avoir un modèle distinct pour les deux problèmes mérite la peine de la duplication et du code de mappage?

    En son cœur, deux modèles concernent la séparation des préoccupations. Je veux que ma vue fonctionne avec un seul modèle. Je souhaite que mon modèle de domaine représente le modèle conceptuel que je construis avec les experts du domaine. ViewModel a souvent des contraintes techniques. Le modèle de domaine concerne POCO, et n’est lié par aucune contrainte technique des données affichées (View) ou persistantes (dans une firebase database ou autre).

    Supposons que trois entités apparaissent sur un écran. Est-ce que cela signifie que je dois imposer une relation entre les trois? Ou créez simplement un object composant ViewModel contenant les trois éléments. Avec un ViewModel distinct, les problèmes liés à View sont séparés de mon domaine.

    Pourquoi? Parce que la vue ne devrait pas avoir la possibilité d’utiliser l’object modèle!

    Imaginez que vous transmettez le projet à un concepteur Web pour effectuer la couche de vue. Tout à coup, il / elle a la possibilité de manipuler les données de votre application via la couche modèle. Ce n’est pas bon.

    Donc, ne transmettez toujours que les données dont la vue a besoin, au lieu de l’object avec les méthodes.

    L’article de JP Boodhoo, les DTO Screen Bound , vous aidera à comprendre les avantages de la conception.

    Il y a aussi un avantage de sécurité sur lequel j’ai écrit.

    Avoir un modèle de présentation simplifie vos vues. Ceci est particulièrement important car les vues sont généralement très difficiles à tester. En ayant un modèle de présentation, vous déplacez beaucoup de travail hors de la vue et dans le modèle de domaine-> présentation. Des choses comme le formatage, la gestion des valeurs NULL et l’aplatissement des graphes d’object.

    Je suis d’accord que la cartographie supplémentaire est une douleur, mais je pense que vous avez probablement besoin d’essayer les deux approches dans votre contexte spécifique pour voir ce qui fonctionne le mieux pour vous.

    Il y a même des préoccupations plus évidentes, y compris la capacité du modèle de vue à être spécialement formaté et certainement null-safe.

    Je suppose que l’idée est que vos modèles de domaine pourraient s’étendre à d’autres implémentations, pas seulement à votre application MVC et que cela briserait le principe de séparation des préoccupations. Si votre modèle de vue est votre modèle de domaine, votre modèle de domaine a deux raisons de le modifier: une modification de domaine ET un changement d’exigence de vue.

    Il semble que je fasse double emploi avec les règles.

    c’est à dire. validation d’object client sur l’interface utilisateur, puis mappage sur l’object de domaine à valider.

    Ce que j’ai tendance à faire cependant, c’est de mapper mon ensemble d’objects de domaine pour créer un modèle, c’est-à-dire. une page Web qui affiche des informations sur les clients, des informations sur les stocks, etc. Mon modèle devient une structure qui contient un object Client et un object Stock.

    SociétéPageModel

    public Client Client {get;} public Stock Stock {get;}

    puis dans mon projet mvc ViewData.Model.Customer.Name ViewData.Model.Stock.CurrentStocks

    La séparation “semble” comme plus de travail, mais plus tard, il est bon d’avoir cette division du modèle d’interface utilisateur / de domaine … comme d’écrire des tests 🙂

    J’ai enfin bu le cool-aide, j’aime bien pouvoir marquer mon modèle de vue avec des instructions d’affichage et le twigr automatiquement.

    Ce que je demande maintenant, c’est une sorte de générateur automatique de modèles de vue à partir d’entités poco. Je mets toujours de la ficelle en int et cela me prend toujours pour la trouver. Ne pensez même pas à faire ceci sans automapper à moins que vous n’aimiez la douleur.