2010-12-06 5 views
25

서비스 계층과 리포지토리의 차이점은 무엇입니까? 저는 데모 ASP.NET MVC 응용 프로그램을 많이 사용해 왔으며 대부분의 응용 프로그램 저장소가 있습니다. 그리고 일부는 둘 다 혼합되어 있습니다. 언제 단지 저장소를 사용하고 언제 서비스를 사용합니까? 또는 둘 다 사용합니까? ASP.NET 웹 응용 프로그램에서도 마찬가지입니다.ASP.NET 서비스 대 리포지토리 계층

답변

29

저장소는 서비스가 일반적으로 이렇게 구현하면서 (등 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); 
    } 
} 

이 그런 다음 컨트롤러 액션에서 직접 서비스를 사용합니다. 그렇게하면 mock을 사용하여 컨트롤러, 비즈니스 규칙 (서비스) 및 지속성 (리포지토리)을 개별적으로/독립적으로 테스트 할 수 있습니다.

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

서비스 계층은 항상 저장소에 해당 메소드 이름을 갖지 않을까요? –

+3

필요는 없습니다. 리포지토리를 많은 쿼리로 생각하십시오. 예를 들어 리포지토리 계층에는 ** IQueryable GetUsers **가있을 수 있지만 서비스 계층에는이 동일한 쿼리 만 사용하는 메서드가 더있을 수 있습니다. 예 : ** ** 사용자 FindUser (int companyId, string name) **, ** bool HasUsers (companyId) ** 등 – Tawani

+1

나는 서비스 계층이 비즈니스 로직을 처리하여 액션 메소드/컨트롤러에서 제거합니다. 제안 Tawani 주셔서 감사합니다. – beaudetious

13

일반적으로 저장소는 데이터 액세스 만 처리합니다. 서비스 계층은 저장소를 사용하고 추가 비즈니스 로직을 적용합니다. 리포지토리는 데이터에 액세스하려는 모든 사용자가 사용할 수있는 것보다 재사용 가능한 레이어라고 생각하십시오. 다른 응용 프로그램 (즉, 서비스 계층에 갈 것) 서로 다른 비즈니스 규칙을 가질 수 있지만, 모두 같은 저장소 계층 implmentation을 사용할 수

+0

어디에 저장소와 서비스를 넣으시겠습니까? 프로젝트 구조는 어떻습니까? MyProject.BusinessObjects 및 MyProject.DataObjects 있습니다. 현재 내 MyProject.BusinessObjects에 내 리포지토리가 있습니다. –

+1

저는 도메인 모델 (엔티티 프레임 워크 edmx)과 저장소 클래스를 별도의 프로젝트 MyProject.Data에 넣는 것을 좋아합니다. 일반적으로 내 서비스는 MVC 웹 응용 프로그램 프로젝트의/Services 폴더에 있습니다 (그러나 필자는 모범 사례 - 단지 개인적인 취향 만 고려할 필요는 없습니다) – kenwarner

+0

@qntmfred : 데이터 비즈니스 로직은 MyProject와 동일한 프로젝트에 있어야합니다 .Data, 그렇지 않으면 MyProject.Data 프로젝트에 의존하는 웹 응용 프로그램 전체에 비즈니스 로직을 복제하게됩니다. – Alkaline

관련 문제