私は現在 DDD で多くの作業を行っていますが、他の集約ルートから集約ルートをロード/操作するときに問題に直面しています。
モデルの集約ルートごとに、リポジトリもあります。リポジトリは、ルートの永続化操作を処理します。
いくつかのメンバー (エンティティと値オブジェクト) を持つ 2 つの集約ルートがあるとします。
AggregateRoot1 と AggregateRoot2。
AggregateRoot1 には、AggregateRoot2 を参照するエンティティ メンバーがあります。
- AggregateRoot1 をロードするとき、AggregateRoot2 もロードする必要がありますか?
- AggregateRoot2 のリポジトリがこれを担当する必要がありますか?
- もしそうなら、AggregateRoot1 のエンティティが AggregateRoot2 のリポジトリを呼び出してロードしてもよろしいですか?
また、AggregateRoot1 のエンティティと AggregateRoot2 の間の関連付けを作成する場合、エンティティを介して行う必要がありますか、それとも AggregateRoot2 のリポジトリを介して行う必要がありますか?
私の質問が理にかなっていることを願っています。
[編集]
現在のソリューション
Twith2Sugarsの助けを借りて、次の解決策を思いつきました。
質問で説明されているように、集約ルートには、他のルートへの参照を持つ子を持つことができます。root2 を root1 のメンバーの 1 つに割り当てる場合、root1 のリポジトリはこの変更を検出し、これを root2 のリポジトリに委譲する役割を果たします。
public void SomeMethod()
{
AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
AggregateRoot1Repository.Update(root1);
}
public class AggregateRoot1Repository
{
public static void Update(AggregateRoot1 root1)
{
//Implement some mechanism to detect changes to referenced roots
AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
}
}
これは単なる例であり、デメテルの法則やその他の最善の原則/実践は含まれていません:-)
さらなるコメントをお待ちしております。