2010-12-06 2 views
25

В чем разница между уровнем сервиса и репозиторием? Я работал над множеством демонстрационных приложений ASP.NET MVC, и большинство из них имеют только репозитории. И у некоторых есть смесь обоих. Когда вы используете только репозитории и когда используете службы/или и то, и другое? То же самое верно для веб-приложений ASP.NET.ASP.NET service vs repository layers

ответ

29

хранилища действуют точно так же, как шлюзы для вашего хранения данных (база данных SQL, XML-файла и т.д.) в то время как услуги, как правило, реализуют так мои бизнес-правила для ваших данных перед отправкой данных, которые будут сохранены в базе данных через репозиторий.

рассмотрим следующий пример:

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); 
    } 
} 

Затем в действие контроллера вы будете использовать службу непосредственно там, где все ваши бизнес-правила могут быть применены. Таким образом, вы можете тестировать контроллеры, бизнес-правила (службы) и настойчивость (репозитории) отдельно/независимо, используя mocks.

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

Репозиторий обычно обрабатывает только доступ к данным. Уровень обслуживания будет использовать репозиторий и применять любую дополнительную бизнес-логику. Подумайте о том, что репозиторий является повторно используемым, чем можно использовать все, что хочет получить доступ к вашим данным. Различные приложения могут иметь различные бизнес-правила (которые идут бы в слое службы), но все могли использовать то же хранилище слой implmentation

+0

Куда вы размещаете ваши репозитории и услуги? Какова ваша структура проекта? У меня есть MyProject.BusinessObjects и MyProject.DataObjects. В настоящее время у меня есть мои репозитории в MyProject.BusinessObjects. – 2010-12-06 15:53:43

+1

Мне нравится разместить мою модель домена (например, инфраструктуру сущности edmx) и классы репозитория в отдельном проекте MyProject.Data. Обычно мои службы живут в проекте MVC Web App в папке/Services (но я бы не стал считать, что наилучшая практика - только личное предпочтение) – kenwarner 2010-12-06 15:56:34