Ответ 1
Репозитории действуют как шлюзы для хранения данных (база данных 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);
}
}
Затем в вашем действии Controller вы будете использовать службу непосредственно там, где могут применяться все ваши бизнес-правила. Таким образом, вы можете тестировать контроллеры, бизнес-правила (службы) и постоянство (хранилища) отдельно/независимо, используя mocks.
public ActionResult CreateUser(User newUser)
{
if(ModelState.IsValid)
{
_userService.Create(this.CurrentUser, newUser);
if(newUser.Id > 0)
return RedirectToAction("UserCreated");
}
return View(newUser);
}