Hauts de France

Modèles de données dans les frameworks MVC

InputModel ViewModel DomainModelParmi les choses les moins comprises parmi le pattern et les frameworks MVC ( Tout framework confondu, en Php, Java, MS.Net, … ) se trouve les différences entre les modèles, ce que représentent les modèles, et les cas d’utilisation vis à vis de ces modèles….

Dans le pattern MVC, nous retrouvons le Modèle, la Vue et le Contrôleur, certes, mais dans une requête de formulaire, est-ce bien uniquement le cas ?
Et bien pas tout à fait !

  1. Dans le schéma ci-dessus, la requête émane de la vue au moment ou l’utilisateur poste ses données ( Input View )
  2. Cette vue génère un modèle, que nous pouvons appeler « Input Model », « InputForm », « Modèle In » ( le terme que j’utilise personnellement ), …
    Ce modèle est transmis à l’action de votre contrôleur
  3. Ce contrôleur traitera avec la couche métier, service, … et transmettra des données ( nous y reviendrons )
  4. En résultat, cette même action devra générer un jeu de données qui sera affichée par la vue résultante de cette requête. Ces données sont stockées dans un modèle également ! ( ViewModel, Output Model, Model out, … ) –
    Attention ! L’usage d’autres canaux pour transmettre des données comme le titre de la page, des données de format, … devrait aussi se trouver dans le modèle ! Si nécessaire, constituer une métaclasse pour transmettre votre modèle ( Domain model par exemple ) et les autres données… – il n’est pas conseillé d’utiliser les variables de session, d’instance, ViewBag, … pour cet effet.
  5. La vue finale ( Ouput View, Result View, … ) utilisera ce ViewModel pour afficher les données dynamiques.

Les modèles sont identiques, doivent être identiques, peuvent être identiques, ou ne sont jamais identiques ?
La réponse…. ça dépends ! 😉

D’une part, est-ce que les données qui transiteront seront identiques ? Généralement, non.

  • Si les données ne sont pas identiques, alors les classes de modèles sont différentes 🙂

Mais si la structure des données est identique ?
Par exemple, les données du formulaire ( Input model ) doivent être à nouveau affichées sans autre information ( Input Model => View Model ),
Ou les Entités ( classes de domaine qui représentent des données de la base, voir le pattern ORM ) peuvent être utilisées telles quelles dans la vue résultat ( Output View )

  • Si les structutres sont identiques, alors deux possibilités !
    1. Une solution « de rigueur », mais un peu lourde : Qu’à cela ne tienne, le View Model sera toujours différent du Domain Model ! Cette solution suit les conventions, mais implique du travail de conception, et d’exécution… ( conception en double des classes, copie des données, … )
    2. Une solution « souple et facile » : Réutilisons le modèle de domaine, les entités, et passons-les telle quelles dans la Output View. Solution simple qui utilise les couches transverses, génère un couplage fort, ….

N’hésitez-pas à me contacter si vous avez toujours des questions à ce sujet 😉