다음과 같이 집계 루트가 있습니다.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과 함께라면
Attachment
클래스를 집계 루트로 모델링하고 이벤트를 사용하여 문서가 첨부 될 때마다 생성 할 수 있습니다. 그러나 그것은 집합 루트처럼 보이지 않습니다. - 디자인 2를 선택하면
Attachment
클래스를 값 개체 또는 엔터티로 모델링 할 수 있습니다. - 또는 CQRS를 사용하는 경우 디자인 1과 모델
Attachment
을 쿼리 모델로 사용하여 이벤트를 사용하여 채울 수 있습니다.
이 시나리오를 모델링하는 올바른 방법은 무엇입니까? 내가 언급 한 다른 모델을 만들 수있는 다른 방법이 있습니까?
다른 문서에 이미 첨부되어있는 경우 문서를 첨부 할 수 없기 때문에 DocumentId 대신 문서를 전달했습니다. 그 유효성 검사 만 위해 문서를 전달합니다.첨부 파일 클래스 자체는 변경 불가능하지만 추가하거나 제거 할 수는 있지만 동작은 없습니다. 지금 제안 할 수 있니? – wolverine
문서를 다른 하나의 문서에만 첨부 할 수있는 경우 로직을 조금 뒤집을 때 성공할 수 있으며 각 문서에 '부모'문서에 대한 참조가 포함되어있는 첨부 된 문서 모음이 포함 된 상위 문서가 아닙니다. 이렇게하면 각 문서의 비즈니스 요구 사항을 충족 할 수 있으며 부모 한 명만 가질 수 있습니다. 주어진 문서의 모든 하위 문서를 찾는 것에 대한 관점은 무엇입니까 (기억하면 도메인 엔티티 개체를 항상 사용할 필요는 없으며보기는 친구입니다) – Joe
@Joe 고마워, 재미있는 제안 – wolverine