2010-03-23 4 views
2

페이지에서 읽기 전용 데이터 목록을 생성해야하며 해당 데이터가 자연히 여러 페이지에서 생성 될 수 있으며, 잠재적으로 5 개 이상에서 생성 될 수도 있습니다 다른 저장소?DDD에서 읽기 전용 목록에 대해 여러 저장소를 사용하는 방법

우리는 DDD를 사용하고 있으며 저장소를 통해 데이터베이스에 대한 액세스를 강제하고 있지만 DDD에 맞지 않는 시나리오가 있으며 사용하기에 가장 적합한 패턴을 결정하려고합니다. .

예를 들어 동영상, 포럼, 블로그 등으로 된 커뮤니티 기반 웹 사이트가 있다고 가정 해 봅시다. 댓글 목록이있는 포럼 페이지가 있습니다. 이것은 거칠지 만 의미가 있기를 바랍니다. 사용자 이름, 지역 사회 점수, 아바타, 전자 메일, 사용자의 블로그 사용자의 비디오 페이지 :

<table> 
<tr><td>User Name (with possible link)</td><td>User's community score.</td><td>User Avatar</td><td>User's E-mail</td><td>User's blog</td><td>User's videos</td></tr> 
</table> 
<table> 
<tr><td>This is a comment.</td></tr> 
</table> 

그래서 각 주석이 여러 개 포함되어 있습니다. 전통적으로 이러한 정보는 모두 별도의 저장소에서 가져옵니다.

문제는 효율성입니다. 리포지토리는 최대화 할 수 있지만 생성 된 집계를 중심으로 만 최대화 할 수 있습니다. 리포지토리를 사용하면 둘 이상의 리포지토리에있는 데이터에 액세스해야하는 순간 읽기 액세스에 비효율적이됩니다.

내 솔루션 관련 정보와 UserInformation DTO를 만들어 내 동료의

ILIst<UserInformation> GetUserForumsUserInformationByForumPostID(int forumPostID). 

하나는 이런 방식으로 DTO를 사용하여 디자인 패턴을 나누기 제안 서명으로 UserForumsRepository의 방법을 배치하는 것입니다 우리는 더 나은 방법은 포럼 주석 ID 목록을 가져온 다음 다양한 ID를 해당 저장소로 전달하여 결과를 반환하는 것입니다.

저의 관점에서 볼 때 저장소의 주된 목적은 CRUD의 CUD 부분에 중요한 비즈니스 로직을 캡슐화하는 것이지만 읽기 전용 목록은 가장 합리적인 방식으로 생성되어야합니다. 적절한 경우 저장소 (예 : 여러 다른 유형 페이지에서 사용되는 공통 위젯)에서 읽기 전용 목록 메소드를 완전히 삭제하는 것이 좋습니다.

이 상황을 어떻게 처리합니까?

답변

1

대답 # 2 여기에 필요한 콘크리트 저장소와 클라이언트 사이의 별도의 서비스 계층입니다 무슨

. 때로는 클라이언트가 필요로하는 것은 리포지토리가 배포되는 경우 특히 리포지토리 계층이 제공하는 것과 다릅니다. 서비스 레이어를 사용하면 거친 메서드를 정의하고 클라이언트에서 세분화 된 세부 정보를 숨길 수 있습니다. 서비스 계층에서는 완전한 비즈니스 객체 대신 경량 DTO를 클라이언트에 전달합니다.

DTO와 그 역으로 비즈니스 오브젝트를 맵핑하려면 Automapper 도구가 꽤 유명 해지고 있습니다.

1

나는 내 자신의 질문에 답하는 것을 싫어하지만 나는 어떤 의견도 갖고 있지 않으며 평소 용의자의 대답을 찾은 것으로 보인다. 파울러.

가장 단순한 DDD와 동일한 설계로 우리의 응용 프로그램은 우리의 저장소에 직접 연결하여 데이터를 얻고 업데이트합니다. 그러나보다 복잡한 시나리오에서는 구체적인 리포지토리와 응용 프로그램 계층 사이에 추가 서비스 계층이 있습니다. 도메인 모델에서 클라이언트로 개체를 전달하는 대신 DTO를 전달합니다.

Fower (PoEAA 401)에 따르면 사용자가 일반적으로 도메인 모델에서 객체를 전송할 수없는 것은 ... 객체가 일반적으로 복잡한 웹에 연결되어있어 불가능하지는 않더라도 직렬화하기 어렵 기 때문입니다 . " Fowler는 "대신 도메인 객체에서 단순화 된 형태의 데이터를 전송해야합니다."

실제로 분산 시스템에서 특히 DTO를 클라이언트에 전달하는 것이 일반적입니다. 서비스 계층이 도메인 계층에서 DTO를 어셈블하는 방법은 클라이언트에게는 중요하지 않아야합니다.

나는 Fowler에 의해이 진술에 조금 괴롭다는 것을 인정해야한다. 나는 ASP.Net MVC에서 도메인 모델을 사용하는 편리함을 매우 좋아한다. 마스터 디테일 UI 디자인 패턴 뷰를 생성 할 때 특히 편리합니다. 강하게 유형화 된 뷰가 고객과 연결되면 CustomerOrders.ascx 부분 뷰 (IList 유형)를 포함하고 customer.Orders를 부분 뷰로 전달하는 코드 행만 필요합니다. 도메인 객체가 작동하지 않는 한이 작업을 계속하는 것이 좋습니다.하지만 이는 미래의 질문입니다.

+0

동작이 적은 도메인 모델은 빈혈 도메인 모델이라고하는 안티 patten입니다. 우리는 당신이 가진 문제를 해결하기 위해 dto를 사용합니다. 하나 이상의 리포지토리가 결합되어 여러 엔터티를 하나의 병합 된 dto로 매핑 한 다음 클라이언트로 보냅니다. 엔티티를 클라이언트에 보내면 도메인 모델의 상태가 일관성없는 방식으로 변경되는 위험이 있습니다. –

+0

서비스 계층이나 저장소 계층에서이 작업을 수행하고 있습니까? – John