0

다음과 같이 집계 루트가 있습니다.DDD : 집계 루트 간의 연결을 모델링하는 방법

@AggregateRoot 
class Document { 
    DocumentId id; 
} 

클라이언트에 의해 주어진 문제 문

그래서 모델을 리팩토링하는

//Design One 
@AggregateRoot 
class Document { 
    DocumentId id; 

    //Since Document is an aggregate root it is referenced by its id only 
    Set<DocumentId> attachments; 

    attach(Document doc); 
    detach(Document doc); 
} 

으로 이어질 것입니다 그러나 만 원이 모델 "A 문서에 여러 첨부 문서를 가질 수있다"입니다 클라이언트가 첨부 파일에 대한 일부 메타 정보 (예 : 첨부 된 사람 및 첨부 된 시간)를 저장하려고하기 때문에 충분하지 않습니다. 이것은 다른 클래스의 생성으로 이어질 것입니다.

class Attachment { 
    DocumentId mainDocument; 
    DocumentId attachedDocument; 
    Date attachedOn; 
    UserId attachedBy; 

    //no operation 
} 

우리는 다시 나는 아래와 같습니다 생각할 수있는 모델링의

//Design Two 
@AggregateRoot 
class Document { 
    DocumentId id; 
    Set<Attachment> attachments; 

    attach(Document doc); 
    detach(Document doc); 
} 

서로 다른 가능성 아래와 같은 문서 모델을 리팩토링 할 수있다.

  1. 디자인 1과 함께라면 Attachment 클래스를 집계 루트로 모델링하고 이벤트를 사용하여 문서가 첨부 될 때마다 생성 할 수 있습니다. 그러나 그것은 집합 루트처럼 보이지 않습니다.
  2. 디자인 2를 선택하면 Attachment 클래스를 값 개체 또는 엔터티로 모델링 할 수 있습니다.
  3. 또는 CQRS를 사용하는 경우 디자인 1과 모델 Attachment을 쿼리 모델로 사용하여 이벤트를 사용하여 채울 수 있습니다.

이 시나리오를 모델링하는 올바른 방법은 무엇입니까? 내가 언급 한 다른 모델을 만들 수있는 다른 방법이 있습니까?

답변

1

엔티티가 아닌 전달 값을 사용하면 코드를보다 쉽게 ​​관리 할 수 ​​있습니다. attach/detach가 전체 문서를 신경 쓰지 않는다면 신경 쓰이는 비트 (인터페이스 분리 원칙이라고도 함) 만 전달하면됩니다. 클라이언트가 첨부 파일에 대한 몇 가지 메타 정보를 저장하려고로 부착되었을 때 누가 그것을 부착처럼

attach(DocumentId); 
detach(DocumentId); 

만이 모델은 충분하지 않을 것입니다.

예, 많은 의미가 있습니다.

이 시나리오를 모델링하는 올바른 방법은 무엇입니까? 제공

정보가 충분하지 않음 ("이 달려있다"말의 정중 한 방법입니다.)

집계 경계는 일반적으로 오히려 구조 나 관계에서보다 행동을보고 발견된다. 첨부 관계는 추가/제거 할 수있는 불변의 값입니까, 아니면 시간이 지남에 따라 변경되는 내부 상태를 가진 엔터티입니까? 첨부 파일을 변경하는 경우 필요한 기타 정보는 무엇입니까?

+0

다른 문서에 이미 첨부되어있는 경우 문서를 첨부 할 수 없기 때문에 DocumentId 대신 문서를 전달했습니다. 그 유효성 검사 만 위해 문서를 전달합니다.첨부 파일 클래스 자체는 변경 불가능하지만 추가하거나 제거 할 수는 있지만 동작은 없습니다. 지금 제안 할 수 있니? – wolverine

+2

문서를 다른 하나의 문서에만 첨부 할 수있는 경우 로직을 조금 뒤집을 때 성공할 수 있으며 각 문서에 '부모'문서에 대한 참조가 포함되어있는 첨부 된 문서 모음이 포함 된 상위 문서가 아닙니다. 이렇게하면 각 문서의 비즈니스 요구 사항을 충족 할 수 있으며 부모 한 명만 가질 수 있습니다. 주어진 문서의 모든 하위 문서를 찾는 것에 대한 관점은 무엇입니까 (기억하면 도메인 엔티티 개체를 항상 사용할 필요는 없으며보기는 친구입니다) – Joe

+0

@Joe 고마워, 재미있는 제안 – wolverine