96 votes

MVCS - Modèle Vue Contrôleur Service

J'utilise le MVC depuis longtemps et j'ai entendu parler de la couche "Service" (par exemple dans un projet web Java) et je me demande s'il s'agit d'un véritable modèle architectural étant donné que je ne trouve pas beaucoup d'informations à ce sujet.

L'idée du MVCS est d'avoir une couche de Service entre le contrôleur et le modèle, pour encapsuler toute la logique métier qui pourrait être dans le contrôleur. De cette façon, les contrôleurs se contentent de transmettre et de contrôler l'exécution. Et vous pouvez appeler un Service dans de nombreux contrôleurs (par exemple, un site web et un webservice), sans dupliquer le code.

3 votes

"Je me demandais si c'est un vrai motif architectural" ... eh bien, pas plus ou moins réel que d'autres motifs de conception :) Tout est question de choisir l'abstraction qui a le plus de sens - dans ce cas, MVCS semble être une abstraction plus utile que MVC lorsque vous traitez avec une variété de sources de données en amont (modèles de bases de données, autres services Web, etc.), et surtout lorsque vous commencez à réfléchir à l'exposition DE votre travail comme un service. Ce motif m'a beaucoup aidé à réutiliser du code lorsque j'avais une application Web que j'ai ensuite exposée sous forme d'API REST.

109voto

Clinton Points 1390

La couche de service peut être interprétée de plusieurs façons, mais c'est généralement là où se trouve votre logique de traitement métier principale, et se situe en dessous de votre architecture MVC, mais au-dessus de votre architecture d'accès aux données.

Par exemple, la couche de votre système complet peut ressembler à ceci :

  1. Couche de vue : Votre framework MVC et le code de votre choix
  2. Couche de service : Votre contrôleur appellera les objets de cette couche pour obtenir ou mettre à jour des modèles, ou pour d'autres requêtes.
  3. Objets d'accès aux données : Ce sont des abstractions que votre couche de service appellera pour obtenir/mettre à jour les données dont elle a besoin. Cette couche appellera généralement une base de données ou un autre système (par exemple : serveur LDAP, service Web ou base de données de type NoSql)

La couche de service serait alors responsable de :

  • Récupérer et créer votre 'Modèle' à partir de différentes sources de données (ou d'objets d'accès aux données).
  • Mettre à jour les valeurs à travers différents dépôts/ressources.
  • Effectuer une logique spécifique à l'application et des manipulations, etc.

Le modèle que vous utilisez dans votre MVC peut ou non provenir de vos services. Vous souhaiterez peut-être prendre les résultats que votre service vous donne et les manipuler en un modèle plus spécifique à votre support (par exemple : une page Web).

2 votes

Je utilise généralement des services pour l'accès externe. Alors que le MVC contiendra toute ma logique spécifique à l'application, j'utiliserai quelque chose comme DBService, ou FacebookOAuthService pour tous les appels externes à d'autres systèmes. Ou pour envelopper une librairie tierce au lieu d'une intégration serrée, cela facilite le remplacement de librairies. Pour moi, cela avait beaucoup de sens de penser aux services de cette manière.

0 votes

Pour ajouter à cela, votre modèle de la couche Services sera davantage un objet de transfert de données, cela peut ou non se traduire directement en quelque chose qui répond directement aux exigences de la vue

2 votes

Cela donne l'impression que c'est juste du MVC mais avec une façade ajoutée pour garder le contrôleur propre.

24voto

Kbdavis07 Points 125

J'avais moi-même pensé à ce motif sans voir aucune référence à celui-ci nulle part ailleurs et j'ai cherché sur Google et trouvé votre question ici :)

Même aujourd'hui, il n'y a pas grand-chose à dire ou à poster sur le

Modèle de service View-Controller.

entrer la description de l'image ici

J'ai pensé vous faire savoir que d'autres pensent de la même façon et que l'image ci-dessus montre comment je vois comment ça devrait être.

Actuellement, je l'utilise dans un projet sur lequel je travaille en ce moment.

Je l'ai en modules avec chaque couche dans l'image ci-dessus dans son propre module autonome.

entrer la description de l'image ici

La couche de services est le "connecteur" "intermédiaire" "contrôleur côté serveur" dans ce que le contrôleur côté "client" fait pour le client, le "Service" fait pour le serveur.

En d'autres termes, le "contrôleur" côté client ne "communique" qu'avec le "service" alias contrôleur côté serveur.

Contrôleur ---> Demandes et Réception de la couche<----- de Service

La couche de service récupère ou fournit des informations aux couches côté serveur qui en ont besoin.

À lui seul, le service ne fait rien d'autre que de connecter les couches serveur à ce dont elles ont besoin.

Voici un exemple de code :

entrer la description de l'image ici

0 votes

La seule préoccupation que j'ai avec ce style d'architecture est de supposer que les DataModels auront la même "forme" que les exigences de la "Vue". S'ils sont en proportion de 1 à 1 ou proches, où vous pourriez insérer quelques propriétés spécifiquement pour la vue, je suppose que c'est correct, mais souvent les DataModels sont conçus d'un point de vue de stockage, et un ViewModel est conçu d'un point de vue des vues.

0 votes

Il existe des "DataModels" et des "ViewModels", le graphique ci-dessus a été réalisé rapidement et mal fait :)

4voto

Jonathan Port Points 91

J'utilise le modèle MVCS depuis des années et je ne savais pas que quelqu'un d'autre le faisait car je ne trouvais pas d'informations fiables sur le web. J'ai commencé à l'utiliser instinctivement, si vous voulez, et il ne m'a jamais laissé tomber pour les projets Laravel. Je dirais que c'est une solution très maintenable pour les projets de taille moyenne, surtout lorsqu'on travaille dans un environnement agile où la logique métier change constamment. Avoir cette séparation des préoccupations est très pratique.

Cela dit, j'ai trouvé que la couche de service était inutile pour les petits projets ou les prototypes et ainsi de suite. J'ai fait l'erreur de compliquer excessivement le projet lors de la création de prototypes et cela signifie en fin de compte que cela prend plus de temps pour concrétiser votre idée. Si vous êtes sérieux au sujet de la maintenance du projet à moyen terme, alors le MVCS est une solution parfaite à mon avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X