16

Foo と Bar という 2 つのエンティティがあるとします。Foo は集約ルートであり、Bar を含みます。私が理解している限り、次のようになります。

public class Foo{
    private readonly Bar Bar;
}

ユーザーが定義済みリストから Foos の Bars を選択 (および変更) できる機能を提供したいと考えています。

リポジトリが集約ルート専用であると想定されている場合、Bar エンティティのリポジトリがないことを意味します。

これは問題につながります - Foo への参照なしで Bar を独立して作成/更新することはできません。

それは、Foo がなければ意味がないにもかかわらず、Bar にはリポジトリがあるはずだということですか?

4

3 に答える 3

18

Foo に関連付けられていないバーのリストから選択する場合、これは集約ルートではありません。たとえば、Order なしで OrderItems のリストを取得することはできないため、これは単一の集約ルート (Order) ですが、Product のリストを取得して OrderItems に割り当てることはできるため、Product は Order 集約ルートの一部ではありません。

OrderItem は Order 集約ルートの一部ですが、個別に作成および更新できることに注意してください。ただし、オーダーを参照しないと取得できません。Bar についても同じです。Foo の一部であっても、each(Foo.Bars) を取得して操作するか、Foo.AddBar(new Bar()) を実行できます。しかし、Foo なしで List を取得する必要がある場合、Bar は Foo 集約の一部ではありません。それは別のエンティティです。

私はここで DDD をそのように見ていますが、もちろん私は Eric Evans ではありません。

于 2009-09-25T17:39:28.603 に答える
8

集約ルートを持つ理由は次のとおりです。

  1. 複合エンティティへの制御および指示されたアクセスを提供します
  2. ルールを適用して、集計全体が有効であることを確認できます

私の見解:Barなしでオブジェクト を選択する必要がある場合はFoo、 を使用しBarRepositoryます。

しかし... を更新してBar、その親の検証規則に違反した場合はどうなるFooでしょうか。これが発生する可能性がある場合は、Barその親を介してアクセスする必要がありますFoo

ただし、多数のオブジェクトにアクセスする必要がありBar(バッチ ジョブやレポートなど)、それが壊れないことがわかっている場合は、 .FoosBarRepository

集約ルートは他の集約ルートで構成できることに注意してください。Barそれが集約ルート自体であることを発見するかもしれませんBarRepository

于 2009-09-26T19:44:20.207 に答える
2

Bar はエンティティである必要がありますか? それを追跡し、ドメインで変更する必要がありますか? それを値オブジェクトとして見ることができる場合は、サービスからフェッチしてから、選択した値オブジェクトを Foo エンティティに「接続」することをお勧めします。ドロップダウン リストによるインスタントの場合。

于 2009-09-25T17:25:42.880 に答える