서비스 계층과 리포지토리의 차이점은 무엇입니까? 저는 데모 ASP.NET MVC 응용 프로그램을 많이 사용해 왔으며 대부분의 응용 프로그램 저장소가 있습니다. 그리고 일부는 둘 다 혼합되어 있습니다. 언제 단지 저장소를 사용하고 언제 서비스를 사용합니까? 또는 둘 다 사용합니까? ASP.NET 웹 응용 프로그램에서도 마찬가지입니다.ASP.NET 서비스 대 리포지토리 계층
답변
저장소는 서비스가 일반적으로 이렇게 구현하면서 (등 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);
}
일반적으로 저장소는 데이터 액세스 만 처리합니다. 서비스 계층은 저장소를 사용하고 추가 비즈니스 로직을 적용합니다. 리포지토리는 데이터에 액세스하려는 모든 사용자가 사용할 수있는 것보다 재사용 가능한 레이어라고 생각하십시오. 다른 응용 프로그램 (즉, 서비스 계층에 갈 것) 서로 다른 비즈니스 규칙을 가질 수 있지만, 모두 같은 저장소 계층 implmentation을 사용할 수
어디에 저장소와 서비스를 넣으시겠습니까? 프로젝트 구조는 어떻습니까? MyProject.BusinessObjects 및 MyProject.DataObjects 있습니다. 현재 내 MyProject.BusinessObjects에 내 리포지토리가 있습니다. –
저는 도메인 모델 (엔티티 프레임 워크 edmx)과 저장소 클래스를 별도의 프로젝트 MyProject.Data에 넣는 것을 좋아합니다. 일반적으로 내 서비스는 MVC 웹 응용 프로그램 프로젝트의/Services 폴더에 있습니다 (그러나 필자는 모범 사례 - 단지 개인적인 취향 만 고려할 필요는 없습니다) – kenwarner
@qntmfred : 데이터 비즈니스 로직은 MyProject와 동일한 프로젝트에 있어야합니다 .Data, 그렇지 않으면 MyProject.Data 프로젝트에 의존하는 웹 응용 프로그램 전체에 비즈니스 로직을 복제하게됩니다. – Alkaline
qntmfred 대답 제요는 다음 리소스를 살펴 제발 그냥 같이
- 1. 서비스 대 리포지토리
- 2. 집합, 리포지토리 및 서비스 계층
- 3. asp.net mvc 질문이있는 도메인 계층 + 저장소 계층
- 4. 서비스 계층과 리포지토리
- 5. Asp.net 대 어떤 웹 서비스?
- 6. 서비스 및 서비스 계층
- 7. 여러 개의 Linq2sql 리포지토리 대
- 8. 리포지토리 및 서비스, MVC 모델
- 9. Asp.net mvc EF4.1 DbContext 및 서비스 계층
- 10. n 계층 비즈니스/서비스 계층 설계
- 11. 리포지토리 패턴
- 12. 리포지토리/서비스 클래스의 올바른 사용
- 13. 리포지토리 및 서비스 디자인 질문
- 14. 서비스 레이어 대 도우미 개체?
- 15. 템플릿 대 액션 계층
- 16. 매핑 대 서비스 계층 또는 비즈니스 로직 위치
- 17. ASP.NET MVC 유닛 테스팅 컨트롤러 - 리포지토리
- 18. ASP.NET 페이지 메서드 대 웹 서비스
- 19. RESTful 서비스 : WCF 대 ASP.NET MVC
- 20. 네트워크 서비스 대 AspNet (Asp.Net 시스템 계정)
- 21. MVP - 발표자와 서비스 계층 - 서비스 계층 선언 위치
- 22. 서비스 계층 디자인 질문
- 23. 웹 서비스 대 XML?
- 24. ASP.NET MVC : BLL 및 DAL을 리포지토리 디자인에
- 25. .Net 웹 서비스, 서비스 수 대 서비스 크기 대
- 26. 정적 클래스로 응용 서비스 계층
- 27. 원격 서비스 대. 지역 서비스
- 28. 서비스 레이어 및 리포지토리 성능 질문
- 29. Mercurial : 세분화 된 리포지토리 대 버전 리포지토리 및 버전 관리의 타사 도구 공유
- 30. asp.net LINQ 대 Datatable
서비스 계층은 항상 저장소에 해당 메소드 이름을 갖지 않을까요? –
필요는 없습니다. 리포지토리를 많은 쿼리로 생각하십시오. 예를 들어 리포지토리 계층에는 ** IQueryable GetUsers **가있을 수 있지만 서비스 계층에는이 동일한 쿼리 만 사용하는 메서드가 더있을 수 있습니다. 예 : ** ** 사용자 FindUser (int companyId, string name) **, ** bool HasUsers (companyId) ** 등 –
Tawani
나는 서비스 계층이 비즈니스 로직을 처리하여 액션 메소드/컨트롤러에서 제거합니다. 제안 Tawani 주셔서 감사합니다. – beaudetious