ASP.NET服务与存储库层

时间:2010-12-06 15:48:26

标签: asp.net asp.net-mvc asp.net-mvc-3 repository

服务层和存储库之间有什么区别?我已经完成了很多演示ASP.NET MVC应用程序,其中大部分只有存储库。有些人混合了两者。什么时候只使用存储库,何时使用服务/或两者兼而有之? ASP.NET Web应用程序也是如此。

3 个答案:

答案 0 :(得分:31)

存储库通常用作数据存储(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操作中,您将直接使用该服务,您可以应用所有业务规则。这样,您就可以使用模拟单独/独立地测试控制器,业务规则(服务)和持久性(存储库)。

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

答案 1 :(得分:13)

存储库通常只处理数据访问。服务层将使用存储库,并应用任何其他业务逻辑。将存储库视为可重用的层,而不是任何想要访问数据的层。不同的应用程序可能有不同的业务规则(可以在服务层中),但都可以使用相同的存储库层实现

答案 2 :(得分:9)

正如qntmfred回答的简编一样,请查看以下资源: