web-dev-qa-db-ja.com

ドメイン駆動設計におけるエンティティとアグリゲートの違い

ドメイン駆動設計におけるエンティティと集約ルートの主な違いは何ですか。たとえば、エンティティフレームワークで、データの整合性エンティティを保証できる場合、集計の使用は何ですか?

13
D_Edet

ドメイン駆動設計の観点から、DbContextはUnitOfWorkの実装であり、DbSet<T>はリポジトリの実装です。

これは、DDDとEntityFrameworkが対照的なポイントです。 DDDは、集約ルートごとにリポジトリを作成することを提案していますが、EntityFrameworkはエンティティごとにリポジトリを作成します。

では、集約ルートとは何ですか?

ソーシャルネットワークがあり、投稿、いいね、コメント、タグのようなentitiesがあると仮定します。 (これらのエンティティ間の関係は想像できると思います)一部のエンティティは「AggregateRoot」です

集合ルートを見つけるために、私はどのエンティティが他のエンティティなしでは生きられないかを見つけようとします。たとえば、いいねやコメントは投稿なしでは生きられません。その場合、Postは集約ルートであり、PostRepositoryが必要であるか、Postエンティティをリポジトリ(インターフェイスのような有名なコレクション)に変換する必要があります。コメントといいね(および投稿)のCRUD操作は、このリポジトリに残しておく必要があります。

42
Mehmet Ataş

定義はかなり簡単です。

  • アグリゲート:基本的に、ルートアグリゲートへの明確な参照を作成するオブジェクトのクラスター。ルートを参照するときに、アグリゲート全体の整合性を確保できます。

集約は、ドメイン駆動設計のパターンです。 DDDアグリゲートは、単一のユニットとして扱うことができるドメインオブジェクトのクラスターです。例として、注文とその広告申込情報があります。これらは個別のオブジェクトになりますが、注文を(広告申込情報とともに)単一の集計として扱うと便利です。

アグリゲートには、そのコンポーネントオブジェクトの1つがアグリゲートルートになります。アグリゲートの外部からの参照は、アグリゲートルートにのみ送信する必要があります。したがって、ルートは集合体全体の整合性を保証できます。

アグリゲートは、データストレージの転送の基本要素です。アグリゲート全体をロードまたは保存するように要求します。トランザクションは集合体の境界を越えてはなりません。

DDDアグリゲートは、コレクションクラス(リスト、マップなど)と混同されることがあります。 DDDアグリゲートはドメインの概念(注文、診療所訪問、プレイリスト)ですが、コレクションは一般的です。アグリゲートには、多くの場合、単純なフィールドとともに複数のコレクションが含まれます。 「アグリゲート」という用語は一般的なものであり、さまざまな異なるコンテキスト(UMLなど)で使用されます。この場合、DDDアグリゲートと同じ概念を指すものではありません。

  • エンティティ:データモデルのコンテキストで、保存されているフォームに関係なく、データの構造を記述します。

EDMは、データをさまざまな形式で保存することから生じる課題に対処します。たとえば、リレーショナルデータベース、テキストファイル、XMLファイル、スプレッドシート、およびレポートにデータを格納するビジネスについて考えてみます。これは、データモデリング、アプリケーション設計、およびデータアクセスにおいて重大な課題を提示します。データ指向のアプリケーションを設計する場合の課題は、効率的なデータアクセス、ストレージ、およびスケーラビリティを犠牲にすることなく、効率的で保守可能なコードを作成することです。データがリレーショナル構造である場合、データアクセス、ストレージ、およびスケーラビリティは非常に効率的ですが、効率的で保守可能なコードの記述はより困難になります。データにオブジェクト構造がある場合、トレードオフは逆になります。効率的で保守可能なコードの記述には、効率的なデータアクセス、ストレージ、およびスケーラビリティが犠牲になります。これらのトレードオフの適切なバランスを見つけることができたとしても、データをあるフォームから別のフォームに移動すると、新しい課題が発生します。エンティティデータモデルは、ストレージスキーマに依存しないエンティティと関係の観点からデータの構造を記述することにより、これらの課題に対処します。これにより、保存された形式のデータは、アプリケーションの設計や開発とは無関係になります。また、エンティティと関係は、(格納された形式ではなく)アプリケーションで使用されるデータの構造を記述するため、アプリケーションの進化に応じて進化する可能性があります。

定義は異なる場合があり、それらはMartinFowlerとMicrosoftによって定義されています。うまくいけば、それは違いを明らかにします。

14
Greg

エンティティ:主にそのIDによって定義されるオブジェクトは、ENTITYと呼ばれ、販売システムで重要性を持つオブジェクト(顧客など)はエンティティであり、時間の経過とともに変化する可能性があります。

値オブジェクト:値オブジェクトは、プロパティと値によってのみ認識されるオブジェクトです。たとえば、「顧客アドレス」は値オブジェクトとして設計できます。値オブジェクトはさまざまなエンティティに割り当てることができ、通常は不変として実装されます(日付、住所など)

Aggregate:AggregateRootオブジェクトを介して相互に関連するエンティティまたは値オブジェクトのコレクション

Aggregate Root:各Aggregateにはルートと境界があります。Aggregate Root Aggregateを所有し、Aggregate内のすべての変更のゲートウェイとして機能します。

1
Reza Jenabi