web-dev-qa-db-fra.com

Créer une couche de service pour mon application MVC?

D'après ce que j'ai compris, MVC sépare les définitions de classe (modèle) de la présentation (vue) via la "colle" qui constitue le contrôleur. Le responsable du traitement devrait avoir une responsabilité unique et donc pouvoir être testé. Les ViewModels sont utilisés pour rassembler les données de plusieurs entités et pour "masser" les données du contrôleur pour la vue.

Il semble que la logique commerciale n'ait pas vraiment sa place ... je pense donc qu'une autre couche de services conviendrait. Je ne sais tout simplement pas où placer cette couche ou comment construire les services. Devrait-il s'agir d'une classe appelée "services" contenant un ensemble de fonctions? Je suis un peu nouveau sur MVC, donc tout matériel de lecture, échantillons ou conseils généraux pour les nouveaux arrivants serait génial.

74
user2062383

J'utilise généralement une couche de service lors du développement d'une application ASP.NET MVC. Il est similaire au modèle de couche de service dont Martin Fowler discute dans Modèles de l’architecture d’applications d’entreprise . Il encapsule votre logique métier et rend les contrôleurs assez minces. Fondamentalement, les contrôleurs utilisent la couche de service pour obtenir les modèles de domaine qui sont ensuite transformés en modèles de vue. J'utilise également le modèle modèle de conception de l'unité de travail pour gérer les transactions et le modèle de conception du référentiel pour encapsuler la couche d'accès aux données afin de faciliter les tests unitaires et de pouvoir échanger facilement les ORM. Cette figure montre les couches typiques que j'utilise dans une application MVC.

MVC Architecture

La couche de service est appelée "couche d'application ou de domaine" dans ce diagramme, car je constate que les gens sont désorientés lorsque vous utilisez le terme "couche de service". Ils ont tendance à penser qu'il s'agit d'un service Web. Il s'agit en réalité d'un assemblage utilisable par votre technologie de service Web préférée, telle que l'API Web ASP.NET ou WCF, ainsi que par un contrôleur.

En ce qui concerne les conventions de dénomination, j’utilise habituellement quelque chose qui décrit le domaine suivi du service. Par exemple, si j’ai une couche de service qui gère l’appartenance à un utilisateur, j’aurais une classe appelée MembershipService qui contient toutes les méthodes requises par les contrôleurs et les services Web pour interroger et manipuler le domaine d’appartenance. Notez que vous pouvez avoir plusieurs domaines dans la même application afin que vous puissiez avoir plusieurs couches de service. Mon argument étant que vous n’avez pas besoin d’un service monolithique qui prend en charge l’ensemble de la demande.

116
Kevin Junghans

Mon conseil est de créer des classes séparées appelées "services". Placez-les dans un projet de bibliothèque de classes (ou d'espace de noms) différent et rendez-les indépendants sur l'infrastructure de la structure MVC. Je recommande d'utiliser également une sorte d'injection de dépendance (la meilleure est l'injection de constructeur). Ensuite, vos classes de service peuvent ressembler à:

 public class MyService : IMyService
 {
     IFirstDependency _firstService;
     ISecondDependency _secondService;

     public MyService(IFirstDependency firstService, ISecondDependency secondService)
     {
     }

     public Result DoStuf(InputDTO)
     {
         // some important logic         
     }
 }

Ensuite, vous utilisez ces services de vos contrôleurs. Regardez ici pour un exemple complet.

Selon les référentiels, mon conseil est de ne pas les utiliser si vous utilisez un ORM moderne (NHibernate, EntityFramework), car votre logique métier sera encapsulée dans la couche de service et votre base de données sera déjà encapsulée avec le cadre ORM.

26
Marian Ban

Consultez le article des meilleures pratiques de MSDN.

Le code source de l'application dans l'article peut être trouvé ici .

10
emre nevayeshirazi

Citant de "La logique métier doit être dans un service, pas dans un modèle"? :

Dans une architecture MVP/MVC/MVVM/MV *, les services n'existent pas du tout. Si tel est le cas, le terme est utilisé pour désigner tout objet générique pouvant être injecté dans un contrôleur ou un modèle de vue. La logique métier est dans votre modèle. Si vous souhaitez créer des "objets de service" pour orchestrer des opérations complexes, cela est considéré comme un détail d'implémentation. Malheureusement, beaucoup de gens implémentent MVC de cette manière, mais cela est considéré comme un anti-modèle (modèle de domaine anémique) car le modèle lui-même ne fait rien, il s'agit simplement d'un ensemble de propriétés pour l'interface utilisateur.

Certaines personnes pensent, à tort, que l’utilisation d’une méthode de contrôleur à 100 lignes et son intégration dans un service constituent en quelque sorte une meilleure architecture. Ce n'est vraiment pas; tout ce qu'il fait est d'ajouter une autre couche d'indirection, probablement inutile. En pratique, le contrôleur fait toujours le travail, il le fait simplement via un objet "helper" mal nommé. Je recommande fortement la présentation de Jimmy Bogard Wicked Domain Models pour un exemple clair de la façon de transformer un modèle de domaine anémique en un modèle utile. Cela implique un examen minutieux des modèles que vous exposez et des opérations réellement valables dans un contexte commercial.

8
Arvand

On dirait que vous voulez quelque chose comme un modèle de référentiel. Vous pouvez lire à ce sujet ici:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an- asp-net-mvc-application

Cette réponse ici peut aussi aider:

Meilleur modèle de référentiel pour ASP.NET MVC

3
jzm