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