29

私は現在 DDD で多くの作業を行っていますが、他の集約ルートから集約ルートをロード/操作するときに問題に直面しています。

モデルの集約ルートごとに、リポジトリもあります。リポジトリは、ルートの永続化操作を処理します。

いくつかのメンバー (エンティティと値オブジェクト) を持つ 2 つの集約ルートがあるとします。

AggregateRoot1 と AggregateRoot2。

AggregateRoot1 には、AggregateRoot2 を参照するエンティティ メンバーがあります。

  1. AggregateRoot1 をロードするとき、AggregateRoot2 もロードする必要がありますか?
  2. AggregateRoot2 のリポジトリがこれを担当する必要がありますか?
  3. もしそうなら、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)
    }
}

これは単なる例であり、デメテルの法則やその他の最善の原則/実践は含まれていません:-)

さらなるコメントをお待ちしております。

4

3 に答える 3

62

私自身もこの状況に陥り、子集計をエレガントな方法で機能させるには頭が痛すぎるという結論に達しました。代わりに、実際に 2 番目の集計を最初の集計の子として参照する必要があるかどうかを検討します。実際の集計自体ではなく、集計の ID の参照を保持するだけで、作業がはるかに簡単になります。次に、両方の集計を含むドメイン ロジックがある場合、これをドメイン サービスに抽出すると、次のようになります。

public class DomainService
{
    private readonly IAggregate1Repository _aggregate1Repository;
    private readonly IAggregate2Repository _aggregate2Repository;

    public void DoSomething(Guid aggregateID)
    {
        Aggregate1 agg1 = _aggregate1Repository.Get(aggregateID);
        Aggregate2 agg2 = _aggregate2Repository.Get(agg1.Aggregate2ID);

        agg1.DoSomething(agg2);
    }
}

編集:

このテーマに関するこれらの記事を本当にお勧めします: https://vaughnvernon.co/?p=838

于 2011-02-07T13:57:52.627 に答える
-4

おそらく、AggregateRoot1 リポジトリーは、AggregateRoot1 エンティティーを構築するときに AggregateRoot2 リポジトリーを呼び出すことができます。

リポジトリはまだ独自のエンティティの取得/作成を担当しているため、これが ddd を無効にすることはないと思います。

于 2011-02-07T09:40:51.863 に答える