ASP.NET service vs repository layers

后端 未结 3 803
故里飘歌
故里飘歌 2021-01-31 18:09

What is the difference between a service layer and a repository? I have worked through a lot of demo ASP.NET MVC apps and most of them have just repositories. And some have a

3条回答
  •  别跟我提以往
    2021-01-31 18:25

    Repositories act just as gateways to your data storage (sql database, xml file etc.) while services usually implement some business rules on your data before sending the data to be saved in the database via a repository.

    consider this example:

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

    Then in your Controller action you will use the service directly where all your business rules can be applied. That way you can test you controllers, business rules (services) and persistence (repositories) separately/independently using mocks.

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

提交回复
热议问题