質問

リポジトリ パターンを適切に使用する方法を理解しようとしています。集約ルートという中心的な概念が次々と登場します。集約ルートとは何かについてのヘルプを求めて Web と Stack Overflow の両方を検索すると、集約ルートに関する議論や、基本定義が含まれているはずのページへのデッドリンクが見つかり続けます。

リポジトリ パターンのコンテキストでは、 集約ルートとは何ですか?

役に立ちましたか?

解決

リポジトリパターンの文脈では、集計根でのみリポジトリからクライアント・コードのロードオブジェクトます。

の子オブジェクトへのリポジトリカプセル化アクセス - 彼らは実際に(遅延ロードのように)必要としているときに、発信者の視点から、それは自動的にロードして、どちらかと同時に、ルートをロードまたはされます。

たとえば、複数のOrderオブジェクトに対する操作をカプセル化LineItemオブジェクトを持っているかもしれません。 LineItemをロードすることはないあなたのクライアントコードは、直接自分のドメインのその部分のための集約ルートになり、それらが含まれているだけでOrderを、オブジェクトます。

他のヒント

エバンスdddから

  

アンAGGREGATEは、我々はデータ変更の目的のための単位として扱うことに関連するオブジェクトの集合です。各集計は、ルートと境界を持っています。 AGGREGATEの内側にあるものの境界を定義。根は、単一の、特定のエンティティがAGGREGATEに含まれています。

  

のルートは、外部オブジェクトがホールドに参照を許可されていることをAGGREGATEの唯一のメンバーである[。]

この手段集計根リポジトリからロードすることができる唯一のオブジェクトであること。

の例では、CustomerエンティティとAddressエンティティを含むモデルです。それは、関連するAddressのコンテキストなしで意味がないよう私たちは、モデルから直接Customerエンティティにアクセスすることはありません。私たちは一緒にそのCustomerAddressを言うことができるようにして凝集体を形成し、その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 つの集約ルートがあります。

  1. お客様
  2. 販売者

顧客が連絡先情報を提供すると、私たちは顧客にトランザクションを割り当て、トランザクションは品目などを取得します。

販売者は製品を販売し、連絡先を持ち、会社概要ページ、特別オファーなどを用意します。

これらは、顧客リポジトリと販売者リポジトリによってそれぞれ処理されます。

から 壊れたリンク:

集約内には集約ルートがあります。集約ルートは、集約内の他のすべてのエンティティおよび値オブジェクトに対する親エンティティです。

リポジトリは集約ルート上で動作します。

さらに詳しい情報も見つかります ここ.

ダイナます:

リポジトリの文脈では、

集約ルートはない親エンティティとエンティティです。それは、ゼロ、一つまたはその存在がその者のアイデンティティのために親に依存している多くの子エンティティが含まれています。これは、リポジトリ内の一対多の関係です。これらの子エンティティはプレーン集約されます。

 ここに画像の説明を入力

集計 何かを集めたものを意味します。
ツリーの最上位ノードのようなもので、そこから次のようなものすべてにアクセスできます <html> Web ページドキュメント内のノード。
ブログに例えると、ユーザーは多数の投稿を作成でき、各投稿には多数のコメントを付けることができます。したがって、任意のユーザーを取得すると、次のように動作できます。 すべての関連投稿とそれらの投稿のコメントにアクセスします。これらはすべてまとめてコレクションまたはコレクションと言われます 集約された

あなたはそのアクセスが集約ルートを考え制限することによって、あなたの不変量と力の一貫性を保護する。ここで、

集合体です。忘れてはいけない、集計は、プロジェクトのビジネスルールや不変条件ではなく、データベースの関係に設計する必要があります。あなたは、任意のリポジトリと無クエリ注入許可されていないではないはずです。

でアーラン集約はなくOO組成物の状態内部データ構造、によって構成されると、凝集体を区別する必要がありません。 https://github.com/bryanhunter/cqrs-with:例を参照してください。 -erlang /木/ NDC-ロンドン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top