以下のように集計ルートがあります。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);
}
につながるリファクタリングしかし、これだけでモデルが勝った「文書に添付ファイルとして複数のドキュメントを持つことができる」ですクライアントが添付ファイルに関するメタ情報(添付した人や添付されたときなど)を保存したいときに十分です。これにより、別のクラスの作成につながります。
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
クラスをモデル化し、文書が添付されるたびにそれらを作成するためにイベントを使用することができ、設計1で行く場合。しかし、それは集約ルートのようには見えません。 - デザインを2つ選択すると、
Attachment
クラスを値オブジェクトまたはエンティティとしてモデル化できます。 - CQRSを使用している場合は、デザインモデル1とモデル
Attachment
をクエリモデルとして使用し、イベントを使用して入力できます。
このシナリオをモデル化する正しい方法はありますか?私が言及した他のものをモデル化する他の方法はありますか?
DocumentIdの代わりにDocumentを渡しました。別のDocumentに既に添付されている場合はDocumentを添付できないため、その検証のためだけにDocumentを渡しています。添付ファイルクラス自体は不変ですが、追加または削除できますが、動作はありません。あなたは今お勧めできますか? – wolverine
文書を他の1つの文書にしか添付できない場合は、論理を少し反転させ、添付文書のコレクションを含む親文書ではなく、それぞれの文書にその親文書への参照が含まれるようにしてください。これにより、各ドキュメントのビジネス要件を満たすことができ、1つの親しか持てません。与えられた文書のすべての子文書を見つけることは、それが何のためのものなのですか(覚えておいてください。ドメインエンティティオブジェクトを常に使用する必要はありません。ビューはあなたの友人です) – Joe
@Joeありがとう、面白い提案 – wolverine