0

引用はDDDからのものです:ソフトウェアの中心にある複雑さへの取り組み(150ページ)

a)

VALUEへのグローバル検索アクセスは、多くの場合意味があります。これは、そのプロパティによってVALUEを見つけることは、それらのプロパティを使用して新しいインスタンスを作成することと同等であるためです。例外があります。たとえば、オンラインでの旅行を計画している場合、予定されている旅程をいくつか保存し、後で戻って予約する旅程を選択することがあります。それらの旅程はVALUESです(同じフライトで構成された2つがある場合、どちらがどちらであるかは気になりません)が、それらは私のユーザー名に関連付けられており、そのまま取得されています。

Itinieraryクライアントがグローバルに検索しCustomer root entityてからこのItinieraryオブジェクトに移動するのではなく、バリューオブジェクトをグローバルにアクセス可能にする方が適切である理由について、作成者の理由がわかりません。

b)

永続オブジェクトのサブセットは、オブジェクト属性に基づく検索を通じてグローバルにアクセス可能である必要があります...それらは通常エンティティであり、複雑な内部構造を持つVALUEオブジェクトの場合もあります...

複雑な内部構造を持つValuesオブジェクトが、単純なValueオブジェクトではなく、グローバルにアクセス可能であることが一般的であるのはなぜですか?

c)とにかく、特定の値オブジェクトをグローバルにアクセス可能にする必要があるかどうかを判断する方法に関する一般的なガイドラインはありますか?

アップデート:

a)

旅程を顧客エンティティを通過可能にするドメインの理由はありません。動作に必要がないのに、なぜ顧客エンティティをロードするのですか?クエリは通常、動作ドメインを複雑にすることなく処理するのが最適です。

私はおそらくこれについて間違っていますが、ユーザー(つまり顧客ルートエンティティ)がログインすると、ドメインモデルがユーザーのを取得することは一般的ではありませんCustomer Aggregateか?

また、ユーザーがフライトを予約するオプションがある場合は、時々チェックすることもよくありますItineraries(ただし、英語は私の母国語ではないため、この用語Itineraryは実際には私が思っているものとは少し異なる意味になる場合があります)彼らは選択または予約しました。

また、Customer AggregateはすでにDBから取得されているItineraryので、一緒に取得されているのに、なぜ別のグローバル検索を発行するのでしょうか(おそらくDBで検索されます)Customer Aggregate

c)

ルールは非常に単純なIMOです-必要がある場合。VO自体の構造には依存しませんが、ユースケースに特定のVOのインスタンスが必要かどうかに依存します。

しかし、このVOインスタンスは特定のエンティティに関連付けられている必要があります(つまりItinerary、特定のエンティティに関連付けられている必要がありますCustomer)。そうでない場合、作成者が指摘したように、プロパティでVOを検索する代わりに、これらのプロパティを使用して新しいVOインスタンスを作成できますか?

2回目の更新:

a)あなたのリンクから:

関係を表現する別の方法は、リポジトリを使用することです。

関係がリポジトリを介して表現される場合、プロパティを実装しSalesOrder.LineItemsますか(リポジトリを直接呼び出すエンティティに対してアドバイスするため、疑わしいです)、次にリポジトリを呼び出します、それとも次のようなものを実装しますSalesOrder.MyLineItems(IOrderRepository repo)か?SalesOrder.LineItems後者の場合、私は財産の必要がないと思いますか?

b)

覚えておくべき重要なことは、集計はデータの表示に使用されることを意図していないということです。

確かに、ドメインモデルは上位層がデータをどのように処理するかを気にしませんが、アプリケーション層とUI層の間でDTOを使用しない場合、UIは集約から表示するデータを抽出すると想定します( UI全体に送信したと仮定します)集合体であり、その中に存在するエンティティだけではありません)?

ありがとうございました

4

1 に答える 1

1

a)旅程を顧客エンティティを通過可能にするドメインの理由はありません。動作に必要がないのに、なぜ顧客エンティティをロードするのですか?クエリは通常、動作ドメインを複雑にすることなく処理するのが最適です。

b)彼の推論は、複雑な値オブジェクトは簡単に再作成できないため、クエリしたいオブジェクトであると思います。この問題とすべてのクエリ関連の問題は、 read-modelパターンで対処できます。

c)ルールは非常に単純なIMOです-必要がある場合。VO自体の構造には依存しませんが、ユースケースに特定のVOのインスタンスが必要かどうかに依存します。

アップデート

a)顧客の集合体が顧客の旅程への参照を持っている可能性は低いです。その理由は、旅程が顧客の集合体に存在する行動にどのように関連するかがわからないためです。また、表示するデータだけが必要な場合は、顧客集計をロードする必要はありません。ただし、アグリゲートをロードし、必要な参照データが含まれている場合は、それを表示することもできます。覚えておくべき重要なことは、集計はデータの表示に使用されることを意図していないということです。

c)顧客と旅程の関係は、共有IDで表すことができます。各旅程にはcustomerIdがあります。これにより、必要に応じてルックアップが可能になります。ただし、これら2つのことが関連しているからといって、表示目的で関連するエンティティまたは値オブジェクトに到達するために顧客をトラバースする必要があるという意味ではありません。より一般的には、関連付けは、直接参照として、またはリポジトリ検索を介して実装できます。どちらの方法でもトレードオフがあります。

更新2

a)リポジトリで実装されている場合、LineItemsプロパティはありません-直接参照はありません。代わりに、ラインアイテムのリストを取得するために、リポジトリが呼び出されます。

b)または、リポジトリから直接返されるDTOのよ​​うなオブジェクトである読み取りモデルを作成することもできます。次に、リポジトリは単純なSQLクエリを実行して、必要なすべてのデータを取得できます。これにより、集計の一部ではないが関連しているデータにアクセスできます。アグリゲートにビューに必要なすべてのデータがある場合は、そのアグリゲートを使用します。ただし、集計に関係のないデータがさらに必要になった場合は、すぐに読み取りモデルに切り替えてください。

于 2013-01-22T20:08:59.653 に答える