저장소가 도메인을 "평평하게"책임을 져야합니까?
-
10-07-2019 - |
문제
면책 조항 : 저는 DDD와 관련 용어를 처음 접 했으므로 개념을 잘못 표시하고 있다면 저를 수정하십시오.
현재 비교적 간단한 도메인 모델 (카탈로그 항목, 각각 카탈로그 항목 모음을 저장하는 카탈로그 항목)이있는 사이트에서 작업하고 있습니다.
내 저장소는 표준 인터페이스를 따릅니다 FindbyID(int ID)
GetAll()
등...
문제는 ID로 특정 이미지를 찾을 때 발생합니다. 나는 다음과 같은 방법으로 끝납니다 FindImagebyID(int CatalogItemID, int ImgID)
새로운 요구 사항이 개발되고 객체 그래프가 더 많이 중첩되면 Find{NestedType}ByID(int catalogItemID,.....,int nestedTypeID)
findall () 메소드에서 ienumerable을 반환하고 더 높은 계층에서 LINQ를 사용하여 이러한 쿼리를 형성해야합니까? 아니면 SOC의 위반일까요?
해결책
여러 리포지토리를 구축하기위한 정당성이있는 것처럼 들립니다.
예시
interface CatalogRepository
{
Catalog FindByID(int ID);
}
interface CatalogImageRepository
{
CatalogImage FindByID(int ID);
}
각 저장소는 해당 특정 엔티티를 다루는 방법을 아는 책임이 있기 때문에 우려 사항을 제대로 분리합니다.
다른 팁
리포지토리 위의 레이어에서 모델을 필터링하고 원하는 경우 LINQ로 필터링합니다. 저장소를 간단하게 만듭니다. LINQ를 사용하여 데이터베이스에서 데이터를 가져 오는 경우이 메소드는 매우 잘 작동합니다. ADO 또는 다른 레거시 데이터 액세스 계층을 사용해야하는 경우 저장소를 간단하게 만드는 것이 더 어려워 질 수 있습니다. LINQ는 리포지토리 리턴을 IQueryable에 쉽게 만들 수 있고 다음 레이어가 필터링을 추가하고 실제 데이터 검색이 요청 될 때까지 발생하지 않도록 쉽게 할 수 있습니다. 이를 통해 모든 이미지를 가져 오는 getImages ()와 같은 저장소에 메소드를 가질 수 있으며 다음 레이어는 특정 이미지에 대한 필터링을 추가합니다. Ado를 사용하고 있다면 아마도 모든 이미지를 다시 가져오고 싶지 않을 것입니다. 그리고 필터 .... 그래서 트레이드 오프가 될 수 있습니다.