DDD-집계 루트 저장소가 집계 저장을 처리합니까?


27

기존 응용 프로그램의 그린 필드 모듈에 DDD와 유사한 접근 방식을 사용하고 있습니다. 아키텍처로 인해 100 % DDD는 아니지만 일부 DDD 개념을 사용하려고합니다. 나는 경계 컨텍스트 (I 그 적절한 용어라고 생각 - 난 아직도 DDD에 대해 배우고)가 두 엔티티 구성을 : ConversationMessage. 대화가없는 메시지는 존재하지 않으며 시스템의 모든 메시지는 대화의 일부이므로 대화는 근본입니다.

나는이 ConversationRepository데이터베이스에 대화를 찾습니다 (정말 더 게이트웨이처럼, 나는 용어 "저장소"를 사용 비록) 클래스; 대화를 찾으면 팩토리를 통해 해당 대화에 대한 메시지 목록 (속성으로 노출됨)을 생성합니다. 이것은 MessageRepository대화가 검색 될 때만 존재하므로 본격적인 클래스 가 필요하지 않기 때문에 물건을 처리하는 올바른 방법 인 것 같습니다 .

그러나 메시지 저장과 관련하여 ConversationRepository의 책임은 메시지의 전체 루트이기 때문에 이것이 ConversationRepository의 책임입니까? 내 말은, ConversationRepository에 메소드를 호출해야한다는 것 AddMessage입니다. 메시지를 매개 변수로 사용하여 데이터베이스에 저장합니다. 또는 메시지 찾기 / 저장을위한 별도의 저장소가 있어야합니까? 논리적 인 것은 엔티티 당 하나의 저장소 인 것처럼 보이지만 "컨텍스트 당 하나의 저장소"를 들었습니다.

답변:


25

파란색 책은 가치가 당신이 DDD 방식의 최고 출력을 얻으려면 읽어 확실히이다. DDD 패턴은 사소한 것이 아니며 각 패턴의 본질을 배우면 어떤 패턴을 사용할지, 애플리케이션을 계층으로 나누는 방법, 집계를 정의하는 방법 등을 숙고하는 데 도움이됩니다.

언급 한 2 개의 엔티티 그룹은 경계 컨텍스트가 아닙니다. 아마도 집계 일 것입니다. 각 집계에는 다른 모든 개체에 대한 집계의 단일 진입 점 역할을하는 개체 인 집계 루트가 있습니다. 따라서 집계 루트가 아닌 다른 집계의 엔터티와 다른 엔터티간에 직접적인 관계는 없습니다.

다른 개체를 통과하여 쉽게 얻을 수없는 엔터티를 보유하려면 리포지토리가 필요합니다. 리포지토리에는 일반적으로 집계 루트가 포함되지만 일반 엔터티 리포지토리도있을 수 있습니다.

귀하의 예에서 대화는 집계 루트 인 것 같습니다. 어쩌면 대화는 응용 프로그램의 시작점이거나 자세한 기준으로 쿼리하여 다른 개체의 간단한 통과를 통해 만족스럽게 액세스 할 수 없도록 할 수 있습니다. 이 경우 클라이언트 코드에 직접 쿼리하거나 추가하거나 삭제하는 일련의 메모리 내 대화의 환상을 클라이언트 코드에 제공하는 리포지토리를 만들 수 있습니다. 반면에 메시지는 대화를 통해 쉽게 얻을 수 있으며 자세한 기준에 따라 대화 메시지를 모두 가져 오려면 리포지토리가 필요하지 않을 수 있습니다.

ConversationRepository는 메시지 지속에 중요한 역할을하지만 언급 한 직접적인 역할은 아닙니다. 따라서 ConversationRepository에 AddMessage ()가 없으며 (그 방법은 대화 자체에 속함) 대신 저장소가 대화를 유지할 때마다 ORM 프레임 워크를 사용하는 경우 투명하게 메시지를 유지하는 것이 좋습니다. (N) 최대 절전 모드, 원하는 경우 임시 SQL 사용 등


1
대화와 같은 집계 루트에 Message, Thingies 및 Wingies와 같이 여러 가지 다른 유형의 엔티티가있는 경우 대화를 저장할 때 (예 : ConversationRepo.save (conversation)), 필요한 엔티티가 무엇인지 어떻게 알 수 있습니까? 구원받을? 위의 포스터 예에서는 메시지 엔터티 만 저장하면됩니다. ID가없는 엔티티를 찾기 위해 집계 루트 내에서 가능한 모든 콜렉션을 순회합니까?
chris-richards

3

ConversationService를 작성 하고 생성자에 IConversationRepositoryIMessageRepository 를 삽입 할 수 있습니다 . 간단한 CRUD 작업에는 리포지토리를 사용하고 그 밖의 모든 서비스 (캐싱, 논리 저장 등)에는 서비스를 사용하십시오.


1
논리 CRUD를 저장하지 않습니까?
Timothy Groote
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.