У нас есть совокупный корень следующим образом.
@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);
}
Но одной этой модели будет недостаточно, поскольку клиент хочет сохранить некоторую метаинформацию о вложении, например, кто и когда прикрепил. Это приведет к созданию другого класса.
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);
}
Ниже приведены различные возможности моделирования, которые я мог придумать.
- Если я выберу первый вариант, я смогу смоделировать класс
Attachment
как совокупный корень и использовать события для их создания всякий раз, когда прикрепляется документ. Но это не похоже на совокупный корень. - Если я выберу второй вариант, то класс
Attachment
можно будет смоделировать как объект значения или как сущность. - Или, если я использую CQRS, я могу выбрать один вариант и модель
Attachment
в качестве модели запроса и заполнить ее с помощью событий.
Итак, как правильно смоделировать этот сценарий? Есть ли другой способ смоделировать другой, о чем я уже говорил?