2010-12-06 27 views
25

Quelle est la différence entre une couche de service et un référentiel? J'ai travaillé avec beaucoup d'applications de démonstration ASP.NET MVC et la plupart d'entre elles ont juste des dépôts. Et certains ont un mélange des deux. Quand utilisez-vous seulement les dépôts et quand utilisez-vous les services/ou les deux? La même chose est vraie pour les applications Web ASP.NET.Service ASP.NET et couches de référentiel

Répondre

29

Référentiels agissent comme passerelles vers votre stockage de données (base de données SQL, fichier xml, etc.) tandis que les services mettent généralement en œuvre de manière Les règles de gestion de données sur vos données avant d'envoyer les données à enregistrer dans la base de données via un référentiel.

considèrent cet exemple:

class UserRepository : IUserRepository 
{ 
    public void Create(User userToCreate) 
    { 
     //update tracking and save to repository 
     _userToCreate.DateCreated = DateTime.Now; 
     _dataContext.AddNew(userToCreate); 
    } 
} 


class UserService : IUserService 
{ 
    private IUserRepository _repository; 

    public UserService(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public void Create(User createdByUser, User userToCreate) 
    { 
     //implement some business rules 
     if(!createdByUser.HasRights(UserRights.CanCreateNewUser)) 
      throw new Exception("This user '"+createdByUser.Name+"' does not have the rights to create a new user"); 

     //update rules auditing 
     _userToCreate.CreatedByUserId = createdByUser.Id; 

     //save entity to repository 
     _repository.Create(userToCreate); 
    } 
} 

Ensuite, dans votre action de contrôleur, vous utiliserez le service directement où toutes vos règles métier peuvent être appliquées. De cette façon, vous pouvez tester vos contrôleurs, règles métier (services) et persistance (référentiels) séparément/indépendamment en utilisant des mock.

public ActionResult CreateUser(User newUser) 
    { 
     if(ModelState.IsValid) 
     { 
      _userService.Create(this.CurrentUser, newUser); 
      if(newUser.Id > 0) 
       return RedirectToAction("UserCreated"); 
     } 
     return View(newUser); 
    } 
+0

La couche de service aura-t-elle toujours un nom de méthode correspondant dans le référentiel? –

+3

Pas nécessairement. Considérez le référentiel comme un ensemble de requêtes. Par exemple, la couche du référentiel peut avoir ** IQueryable GetUsers ** mais la couche de service peut avoir plusieurs méthodes qui utilisent uniquement cette même requête. par exemple. ** IList GetUsers (int companyId, int pageNo) **, ** utilisateur FindUser (int companyId, nom de chaîne) **, ** bool HasUsers (companyId) ** etc – Tawani

+1

J'aime la notion que la couche de service serait gérer la logique métier en la retirant ainsi des méthodes/contrôleurs d'actions. Merci pour les suggestions Tawani. – beaudetious

13

Un référentiel gère généralement uniquement l'accès aux données. Une couche de service utilisera un référentiel et appliquera toute logique métier supplémentaire. Considérez le référentiel comme une couche réutilisable qui pourrait être utilisée par tout ce qui veut accéder à vos données. Différentes applications peuvent avoir différentes règles métier (qui irait dans la couche de service), mais peuvent tous utiliser la même couche dépôt implmentation

+0

Où placeriez-vous vos dépôts et services? Quelle est la structure de votre projet? J'ai MyProject.BusinessObjects et MyProject.DataObjects. J'ai actuellement mes dépôts dans MyProject.BusinessObjects. –

+1

J'aime mettre mon modèle de domaine (framework framework edmx par exemple) et les classes de repository dans un projet séparé MyProject.Data. Habituellement, mes services se trouvent dans le projet MVC Web App, dans un dossier/Services (mais je ne considérerais pas forcément cela comme une meilleure pratique - juste une préférence personnelle) – kenwarner

+0

@qntmfred: La logique métier doit être dans le même projet que MyProject .Data, sinon vous finirez par dupliquer la logique métier sur les applications Web qui s'appuient sur le projet MyProject.Data. – Alkaline