ASP.NET服务与存储库层

Bre*_*ogt 26 asp.net asp.net-mvc repository asp.net-mvc-3

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

Taw*_*ani 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的Controller操作中,您将直接使用该服务,其中可以应用所有业务规则.这样,您可以使用模拟单独/独立地测试控制器,业务规则(服务)和持久性(存储库).

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

  • 不必要.将存储库视为一堆查询.例如,储存库层可能具有**IQueryable的<用户> GetUsers**但服务层可以具有仅使用此相同的查询更多的方法.例如**IList <User> GetUsers(int companyId,int pageNo)**,**User FindUser(int companyId,string name)**,**bool HasUsers(companyId)**等 (3认同)

ken*_*ner 13

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


Lor*_*nzo 9

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