集約ルートとは何ですか?
-
21-09-2019 - |
質問
リポジトリ パターンを適切に使用する方法を理解しようとしています。集約ルートという中心的な概念が次々と登場します。集約ルートとは何かについてのヘルプを求めて Web と Stack Overflow の両方を検索すると、集約ルートに関する議論や、基本定義が含まれているはずのページへのデッドリンクが見つかり続けます。
リポジトリ パターンのコンテキストでは、 集約ルートとは何ですか?
解決
リポジトリパターンの文脈では、集計根でのみリポジトリからクライアント・コードのロードオブジェクトます。
の子オブジェクトへのリポジトリカプセル化アクセス - 彼らは実際に(遅延ロードのように)必要としているときに、発信者の視点から、それは自動的にロードして、どちらかと同時に、ルートをロードまたはされます。
。たとえば、複数のOrder
オブジェクトに対する操作をカプセル化LineItem
オブジェクトを持っているかもしれません。 LineItem
をロードすることはないあなたのクライアントコードは、直接自分のドメインのその部分のための集約ルートになり、それらが含まれているだけでOrder
を、オブジェクトます。
他のヒント
アンAGGREGATEは、我々はデータ変更の目的のための単位として扱うことに関連するオブジェクトの集合です。各集計は、ルートと境界を持っています。 AGGREGATEの内側にあるものの境界を定義。根は、単一の、特定のエンティティがAGGREGATEに含まれています。
と
のルートは、外部オブジェクトがホールドに参照を許可されていることをAGGREGATEの唯一のメンバーである[。]
この手段集計根リポジトリからロードすることができる唯一のオブジェクトであること。
の例では、Customer
エンティティとAddress
エンティティを含むモデルです。それは、関連するAddress
のコンテキストなしで意味がないよう私たちは、モデルから直接Customer
エンティティにアクセスすることはありません。私たちは一緒にそのCustomer
とAddress
を言うことができるようにして凝集体を形成し、そのCustomer
は、集約ルートです。
集計ルートシンプルなアイデアのための複雑な名前です。
<時間>一般的な考え方
よく設計されたクラス図は、その内部をカプセル化します。あなたはこのような構造にアクセスするためのポイントはaggregate root
呼ばれます。
は、ソリューションの内部構造が非常に複雑になるかもしれませんが、この階層のユーザーは、ちょうどroot.doSomethingWhichHasBusinessMeaning()
を使用します。
例
どのようにあなたの車に乗りたいですか?より良いAPIを選択しました。
オプションA(それだけで何とか動作します):
car.ride();
オプションB(ユーザクラスinernalsへのアクセスを有する)。
if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
for (Wheel w: car:getWheels()){
w.spin();
}
}
あなたはそのオプションAはその後、より良いお祝いの言葉だと思います。あなたはaggregate root
の背後にある主な理由を取得します。
集約ルートは複数のクラスをカプセル化します。あなただけのメインオブジェクトを介して階層全体を操作することができます。
はそのソフトウェアエンティティおよびハードウェアの実体のないこのエンティティは、ライブすることはできません、あなたがコンピュータのエンティティを持っている想像してみてください。これらのフォームComputer
の集約、ドメインのコンピュータ部分のためのミニ生態系ます。
集約ルートは(我々の場合のComputer
に)集約内の母船のエンティティである、集計根である企業とのリポジトリだけの仕事を持っていることが一般的であり、このエンティティが他のエンティティを初期化する責任があります。
凝集するエントリポイントとして集約ルートを検討します。
のC#コード:
public class Computer : IEntity, IAggregateRoot
{
public Hardware Hardware { get; set; }
public Software Software { get; set; }
}
public class Hardware : IEntity { }
public class Software : IValueObject { }
public class Repository<T> : IRepository<T> where T : IAggregateRoot {}
例として、それを考慮し、ハードウェアは、おそらくあまりにも(それ自身のアイデンティティを持っていない)ValueObjectになることに注意してくださいだけます。
データベースファーストのアプローチに従う場合、通常、集約ルートは 1 対多のリレーションシップの 1 側のテーブルになります。
最も一般的な例は人です。各人は多数の住所、1 つ以上の給与明細、請求書、CRM エントリなどを持っています。常にそうなるとは限りませんが、9/10 回はそうなります。
私たちは現在、電子商取引プラットフォームに取り組んでおり、基本的に 2 つの集約ルートがあります。
- お客様
- 販売者
顧客が連絡先情報を提供すると、私たちは顧客にトランザクションを割り当て、トランザクションは品目などを取得します。
販売者は製品を販売し、連絡先を持ち、会社概要ページ、特別オファーなどを用意します。
これらは、顧客リポジトリと販売者リポジトリによってそれぞれ処理されます。
集計 何かを集めたものを意味します。
根 ツリーの最上位ノードのようなもので、そこから次のようなものすべてにアクセスできます <html>
Web ページドキュメント内のノード。
ブログに例えると、ユーザーは多数の投稿を作成でき、各投稿には多数のコメントを付けることができます。したがって、任意のユーザーを取得すると、次のように動作できます。 根 すべての関連投稿とそれらの投稿のコメントにアクセスします。これらはすべてまとめてコレクションまたはコレクションと言われます 集約された
集合体です。忘れてはいけない、集計は、プロジェクトのビジネスルールや不変条件ではなく、データベースの関係に設計する必要があります。あなたは、任意のリポジトリと無クエリ注入許可されていないではないはずです。
でアーラン集約はなくOO組成物の状態内部データ構造、によって構成されると、凝集体を区別する必要がありません。 https://github.com/bryanhunter/cqrs-with:例を参照してください。 -erlang /木/ NDC-ロンドンの