5

Domain-Driven Design: Tackling Complexity in the Heart of Software の次の定義に基づいて、

集約とは: データ変更の目的で 1 つの単位として扱われる、関連付けられたオブジェクトのクラスター。外部参照は、ルートとして指定された AGGREGATE の 1 つのメンバーに制限されます。AGGREGATE の境界内では、一連の整合性ルールが適用されます。

Aggregate ルートがリポジトリへの参照を保持する必要はないと思います。Aggregate ルートは、そのエンティティと集計への参照を保持する必要がある唯一のルートであるため、非公開にする必要があります。

私のリポジトリはどのようにしてこのプライベート データを保持し、復元できますか?


編集:

古典的な Order、OrderLines の例を見てみましょう。

オーダーは集約ルートです。

その線はエンティティです。

Aggregate ルート (注文) は、そのエンティティ (注文明細) への参照を保持できる唯一のオブジェクトであるため、リポジトリから注文明細を保持する方法がわかりません。

4

2 に答える 2

5

私が集約ルートを理解している限り、それはそのスコープ内のすべてのエンティティにアクセスする場所でなければなりません。つまり、従来の ORM が使用されている限り、Order を通じて OrderLines にアクセスできます。

さらに、ルート内のエンティティへの参照を取得することは禁止されていませんが、これらの参照は揮発性 (つまり、存続期間が短い) である必要があり、集約ルートを介して再参照を取得する必要があります。

DDD に関して言えば、リポジトリを使用してデータ アクセスを隠し、ファクトリはファクトリを使用してオブジェクトを組み立てます。facotry はオブジェクトの内部構造をよく知っており、新しいオブジェクトを構築したり、リポジトリから渡されたデータからオブジェクトを復元したりできなければなりません。

おそらく、エンティティを永続化するための別のアプローチを提供する CQRS + イベント ソーシングも調べることができます。

于 2011-08-09T06:32:47.773 に答える
0

ほとんどの人は、リポジトリは集約ルートの論理的な機能であると考えています (従来の DDD では集約ごとに 1 つしかないため)。

ただし、それらを本当にプライベートにしたい場合は、リフレクションに頼る必要があります。そうしないと、集約ルート エンティティに永続的な方法でそれらを返させる必要があります (おそらく、何らかの内部呼び出しを使用して)。

于 2011-02-28T21:04:54.340 に答える