2009-10-29 4 views
1

면책 조항 : 저는 DDD와 관련 용어에 익숙하지 않으므로 개념을 잘못 표기하면 제발 저를 시정하십시오. 나는 현재 비교적 간단한 도메인 모델 사이트에서 (CatalogImage 항목의 컬렉션을 저장하는 각각의 카탈로그 항목을.) 일하고 있어요리포지토리가 도메인을 "병합"해야합니까?

내 저장소 FindbyID(int ID)GetAll() 등의 표준 인터페이스를 다음과 ...

ID로 특정 이미지를 찾으려고 할 때 문제가 발생합니다. 나는 그런

새로운 한 요구 사항이 개발할 FindImagebyID(int CatalogItemID, int ImgID) 등의 방법으로 끝낼하고, 객체 그래프가 더 많이 중첩되고, 나는 단순히 findall은에서 IEnumerable을 반환해야 하는가 등의 Find{NestedType}ByID(int catalogItemID,.....,int nestedTypeID)

등의 방법의 폭발을 볼 수 있었다() 메소드를 사용하고, 상위 계층에서 Linq를 사용하여 이러한 쿼리를 구성합니까? 아니면 SoC 위반일까요?

답변

2

여러 저장소를 만드는 것이 타당한 것처럼 들립니다.

interface CatalogRepository 
{ 
    Catalog FindByID(int ID); 
} 

interface CatalogImageRepository 
{ 
    CatalogImage FindByID(int ID); 
} 

각 저장소가 특정 개체를 처리하는 방법을 아는에 대해서만 책임이 때문에 제대로, 귀하의 우려를 분리합니다.

+0

실제로 엔티티/모델이 방금 큰지 궁금하신가요? – CSharpAtl

+0

나는 일반적인 접근법을 좋아하지만, CatalogImageRepository의 FindByID 메소드는 이미지와 연관된 카탈로그 항목을 어떻게 알 수 있을까? – gn22

+0

@CSharpAtl 모델의 크기가 큰지는 확실하지 않습니다. OP가 DAL을 쿼리하는 방법에 대한 질문에 더 가깝습니다. 항상 같은 방식 (예 : FindById 등)으로 쿼리되는 경우 계속 길을 계속하는 것이 좋습니다. 그러나 동적 쿼리의 경로를 시작하면 Command Query Separation을 구현하는 것이 더 좋은 방법 일 것이라고 생각하지만 전체 디자인을 변경해야합니다. – Joseph

0

원하는 경우 LINQ를 사용하여 저장소 위의 계층에서 모델을 필터링합니다. 저장소를 단순하게 만듭니다. LINQ를 사용하여 데이터베이스에서 데이터를 가져 오는 경우이 방법은 매우 효과적입니다. ADO 나 다른 레거시 데이터 액세스 계층을 사용해야하는 경우 저장소를 단순하게 만드는 것이 어려울 수 있습니다. Linq를 사용하면 저장소에서 IQueryable을 반환하고 다음 계층에 필터링을 추가하게하고 요청할 때까지 데이터의 실제 검색을 수행하지 않도록 할 수 있습니다. 이렇게하면 모든 이미지를 가져 오는 GetImages()와 같은 리포지토리에 메서드를 포함 할 수 있으며 다음 레이어는 특정 이미지에 대한 필터링을 추가합니다. ADO를 사용하고 있다면 아마 모든 이미지를 다시 가져 와서 필터링하고 싶지 않을 것입니다. 그래서 거래가 될 수 있습니다.

관련 문제