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); 
} 

につながるリファクタリングしかし、これだけでモデルが勝った「文書に添付ファイルとして複数のドキュメントを持つことができる」ですクライアントが添付ファイルに関するメタ情報(添付した人や添付されたときなど)を保存したいときに十分です。これにより、別のクラスの作成につながります。

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クラスをモデル化し、文書が添付されるたびにそれらを作成するためにイベントを使用することができ、設計1で行く場合。しかし、それは集約ルートのようには見えません。
  2. デザインを2つ選択すると、Attachmentクラスを値オブジェクトまたはエンティティとしてモデル化できます。
  3. CQRSを使用している場合は、デザインモデル1とモデルAttachmentをクエリモデルとして使用し、イベントを使用して入力できます。

このシナリオをモデル化する正しい方法はありますか?私が言及した他のものをモデル化する他の方法はありますか?

答えて

1

エンティティではなく、渡す値によってコードを管理しやすくなる場合があります。アタッチ/デタッチがドキュメント全体を気にしない場合は、気にするビット(インターフェース分離原理とも呼ばれます)を渡してください。クライアントが添付ファイルに関するいくつかのメタ情報を格納するために望んでいるとして、それが接続されたとき、誰がそれを添付など

attach(DocumentId); 
detach(DocumentId); 

だけでこのモデルは、十分ではありません。

はい、多くの意味があります。

これはこのシナリオをモデル化する正しい方法ですか?

提供されていない十分な情報(「それが依存」というのが丁寧なやり方。)

集計境界は通常、むしろ構造や関係よりも、行動を調べることによって発見されています。アタッチメントの関係は、追加/削除できる不変の値か、時間の経過とともに変化する内部状態のエンティティですか?添付ファイルを変更した場合は、その他の情報が必要です。

+0

DocumentIdの代わりにDocumentを渡しました。別のDocumentに既に添付されている場合はDocumentを添付できないため、その検証のためだけにDocumentを渡しています。添付ファイルクラス自体は不変ですが、追加または削除できますが、動作はありません。あなたは今お勧めできますか? – wolverine

+2

文書を他の1つの文書にしか添付できない場合は、論理を少し反転させ、添付文書のコレクションを含む親文書ではなく、それぞれの文書にその親文書への参照が含まれるようにしてください。これにより、各ドキュメントのビジネス要件を満たすことができ、1つの親しか持てません。与えられた文書のすべての子文書を見つけることは、それが何のためのものなのですか(覚えておいてください。ドメインエンティティオブジェクトを常に使用する必要はありません。ビューはあなたの友人です) – Joe

+0

@Joeありがとう、面白い提案 – wolverine

関連する問題