저장소 패턴 및 비즈니스 로직
-
06-07-2019 - |
문제
저장소가 있습니다 (CustomerRepository
) 데이터 계층에서 데이터를 검색합니다. 대부분의 비즈니스 로직은 엔티티 클래스에 있습니다 (Customer
) 리포지토리가 수락하거나 반환합니다.
그러나 모든 고객에게 적용되는 글로벌 엔티티 비즈니스 로직을 어디에 두십니까?
예를 들어, 모든 고객을 특정 사용자에게 반환하고 싶지 않을 수도 있습니다. 저장소에 그 논리를 넣고 싶지 않습니다.
해결책
나는 Robert Munteanu에 동의합니다.
기본적으로 모델에 내재 된 비즈니스 로직을 중간 계층으로 롤업합니다. 중간 계층은 비즈니스 계층 / 비즈니스 객체 / 비즈니스 로직 계층 등이지만 서비스 계층이라고합니다. 웹 서비스 일 필요는 없으며 특정 응용 프로그램 영역의 기능을 집계한다는 점에서 서비스를 광범위하게 사용합니다.
기본적으로 리포지토리 참조가 포함 된 CustomersOrvice 클래스가 있습니다. 프레젠테이션 계층은 서비스 계층 클래스를 참조합니다.
.NET을 사용하는 이름에서 추측으로 만들 수있는 추가 차이가 있으며, 아마도 Nerddinner에 요약 된대로 리포지토리로 LINQ에서 SQL을 사용할 수 있습니다.
이 저장소는 일반적으로 서비스 계층에 iqueryable을 반환하여 서비스 계층 체인이 여러 쿼리를 하나로 묶어 다른 결과 세트를 빌드 할 수 있습니다. 그런 다음 서비스는 Tolist 또는 다른 유사한 방법을 사용하여 표현식을 평가하고 프레젠테이션 계층으로 반환합니다.
다른 팁
서비스 뒤에 싸십시오.
다른 저장소 (BusinessRulerePository)에 넣고 고객 편견을 사용하도록하십시오.
또는
비즈니스 로직이 결과를 제한하는 경우 사용자가 공장에서 외관 패턴을 사용하고 싶을 수 있습니다. 이 경우 CustomerRepository 및 LimitedCustomerRepository (CustomerRepository를 캡슐화 할 수 있음) 및 사용자에게 적절한 iCustomerRepository를 반환하는 CustomerRepositoryFactory를 처리하는 iCustomerRepository가 있습니다.
이러한 유형의 함수를 서비스 계층으로 분리하는 것이 길이라고 생각합니다.
나는 최근에 과거 데이터를 사용하여 많은 엔티티와 복잡한 예측을 할 수있는 시스템을 구축했습니다. 모든 데이터 액세스 비트를 각 엔티티의 저장소에 넣습니다. 복잡한 예측 논리는 서비스 계층에 보관하고 필요에 따라 저장소 객체를 전달했습니다.
추가 보너스는 단순히 웹 API 계층을 만들어 외부 시스템에 모든 예측 논리를 노출시키는 쉬운 방법이 있다는 것입니다.