Служба ASP.NET против уровней хранилища - PullRequest
26 голосов
/ 06 декабря 2010

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

Ответы [ 3 ]

31 голосов
/ 06 декабря 2010

Репозитории действуют как шлюзы к вашему хранилищу данных (база данных 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);
   }
}

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

    public ActionResult CreateUser(User newUser)
    {
        if(ModelState.IsValid)
        {
           _userService.Create(this.CurrentUser, newUser);
           if(newUser.Id > 0)
               return RedirectToAction("UserCreated");
        }
        return View(newUser);
    }
13 голосов
/ 06 декабря 2010

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

9 голосов
/ 06 декабря 2010

Так же, как сборник ответов qntmfred , просмотрите следующие ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...