2017-09-27 10 views
3

DDDでは、レポジトリを使用して集約のシリアライゼーションとデシリアライゼーションが実行されます。データベースの読み書きによってそうすることで、集約にはより純粋なビジネスロジックを含めることができ、ドメイン固有でない永続戦略には結合しません。リポジトリは、ドメイン駆動型設計の集約でのみ使用されるのはなぜですか?

しかし、なぜリポジトリが常に集約に使用されていると記載されているのだろうか。すべてのエンティティに同じように動機づけられているのではないでしょうか?

(これはすべてのプレーンエンティティがゼロの子供たちと集計のルーツとして見ることができるという事実の問題だけであれば、この情報を知らせて、質問を埋め込むことができるしてください。)

+1

最後の文章は正しいです。私は本を​​読んで、単一のエンティティが子供のいない集約ルートになる可能性があり、リポジトリに格納される可能性のある候補でもあるという結論に達しませんでした。 –

+1

すべて一致します。エンティティにはライフサイクルとそれ自身のアイデンティティがあります。したがって、それを検索して操作することができます。それを見る別の方法は、リポジトリがエンティティを返すことです。そのエンティティは、他のオブジェクトを集約することも、集約することもできません。リポジトリが取得するものについて:私は、青い本に、リポジトリがエンティティおよび/またはARを読み込むことを示す内部カバー上のイメージを持っていると確信しています。 –

答えて

5

私は疑問に思いますなぜリポジトリが集約のために使用されていると常に記述されているのか。すべてのエンティティに同じように動機づけられているのではないでしょうか?

アグリゲートは、アプリケーション層に公開される整合性境界です。

つまり、リポジトリはデータストアから状態のスナップショットを取得し、そこから集約を構成するエンティティと値のグラフを作成する責任があります。

リポジトリのAPIは、一貫性境界を定義するため、集約ルートのみを公開します。アプリケーションをグラフ内の任意の場所に移動させて変更するのではなく、アプリケーションが強制的にルートオブジェクトと通信するように強制します。この制約が満たされているため、すべての変更がビジネス不変条件を満たすことを確実にするために、1か所を調べるだけで済みます。

このように、アプリケーションはモデルのエンティティの種類ごとにリポジトリを開発する必要はありません。なぜなら、アプリケーションはその細かい粒度でモデルと直接対話することができないからです。別の言い方をすれば、集約内のエンティティはプライベートのデータ構造です。クライアントがAPIを過ぎてポインタを直接操作できるリストを実装しないのと同じ理由で、クライアントコードがエンティティを直接操作することは許されません。

、あなたは骨材以外のものに使用されている見る「リポジトリ」を行う- リポジトリは、モデルの状態のキャッシュされたビューをルックアップするためにも使用することができます。そのトリックは、ビューがの変更をサポートしていないということです。エバンスが述べているアプローチでは、各エンティティはすべての役割を果たす単一の表現を持っています。 CQRSでは、エンティティは各ロールで異なる表現を持つことができますが、通常はエンティティの変更をサポートする単一のロールだけです。

1

DDDには、2つの種類のエンティティがあります。集約ルーツとネストされたエンティティ。 @VoiceOfUnreasonと答えているので、集約されたエンティティを集約の外から変更することはできません。したがって、それらのリポジトリを持つ必要はありません(「リポジトリ」によって読み込み用のインターフェイスを参照し、エンティティの状態を保持します)。もしあなたが許可されれば、それは集計のencapsulationを破るでしょう。カプセル化は、豊富なドメインで役立ちます.DDDが理想的なモデルがたくさんあります。