0

「DDD」では、エンティティのさまざまなバージョンを処理するための最良のパターンは何ですか。たとえば、リスト内のエンティティと完全なオブジェクトのエンティティです。エンティティをリストに表示するときに不要なプロパティを取得するオーバーヘッドを回避したい

リストで別のエンティティ タイプを使用しますか、それとも完全なエンティティ タイプを部分的に埋めるだけですか? 継承を使用しますか?

4

2 に答える 2

0

CQRSパターンを使用して、クエリ処理とコマンド処理を分離できます。また、単一のデータベースでも実行できます。このような場合、ビューモデルをデータベースのテーブルに直接マップします(たとえば、NHibernateを介して)。コマンド(書き込み)は実際のドメインモデルを通過し、DBに保持されます。クエリ(エンティティのリストを取得するなど)は、ドメインをバイパスしてDBを実行します。ドメインオブジェクトをクエリしても意味がありません。実際には、ドメインオブジェクトでビジネスロジックを呼び出さず、データを取得するだけだからです。

コマンド側とクエリ側に別々のストアを用意することで、このソリューションをフル機能のCQRSに拡張することもできます。クエリ側は、レプリケーションまたはpub/subメッセージングによって同期されます。

于 2010-06-25T04:17:28.910 に答える
0

ドメイン内のモデルの「ビュー」を作成したいというあなたの衝動は理解していますが、それはお勧めしません。個人的には、状況に関係なく、ドメイン内のエンティティ全体を使用します。エンティティはエンティティであり、それ以下またはそれ以上のものは、きれいに感じられません。ただし、エンティティへの参照を使用して、リスト内のアイテムの使用に集中できないという意味ではありません。

私の実装では、エンティティはドメイン境界を越えません。代わりに、DTO の型を返し、そこからビューを抽象化できるアプリケーション サービスを用意しています。これにより、たとえば、プレゼンターが DTO から正しいビュー モデルを生成し、それをビューに提供できるようになります。ドメイン サービスでの操作について話しているのか、アプリケーション サービスでの操作について話しているのかわかりませんが、どちらか (または両方) に適用できる操作がいくつかあります。

ドメイン層でエンティティ全体を操作することによるパフォーマンスの低下を軽減するために、特定のことを行うこともできます。注目すべきことの 1 つは、ある種のキャッシュ アサイド実装を実装することです。エンティティが要求されたら、それがキャッシュされているかどうかを確認します。存在する場合は、キャッシュされたバージョンを返します。そうでない場合は、プルしてからキャッシュしてから返します。エンティティが更新されたら、キャッシュから削除して更新を行います。これを容易にするために、具体的なリポジトリの実装を意図的にキャッシュ対応にするように作成しました。このようなアプローチを使用する際に考慮すべきもう 1 つの点は、できるだけ多くのきめ細かい操作を行うことが有益であるということです。最初は非論理的に思えますが、エンティティが一般的にデータ ストアから「取得」されている場合、

あなたの質問に一周します...私が扱うほとんどのリストは小さいので、エンティティ全体をロードするというペナルティが発生します。ほとんどのユース ケースでは、ユーザーが 1 つ以上のアイテムにドリルダウンする必要があると想定すると、アイテムはキャッシュ アサイド実装のために事前にキャッシュされます。アイテムの数は流動的ですが、私は通常、このアプローチをリスト内の 25 未満のエンティティに適用します。

より大きなリストの場合は、ID のみを使用します。ほとんどの場合、ここでの使用例は何らかの検索結果です。たとえば、検索結果は一般的にページングされますが、これは上記のパターンには当てはまりません。代わりに、ID のより大きなリストを、関心のあるエンティティのスライディング レンジ ウィンドウとして使用し、すべてのリポジトリにある GetRangeById() メソッドに渡します。これは、意図的に識別子のリストを取得し、それらをロードするように記述されています。それらがキャッシュされるようにします。本質的に、これはより大きな軽量リストを取り、特定の時点で私が興味を持っている領域だけをゼロにします。

このようなアプローチで実現する重要なことは、拡張性が高いということです。データ セットが小さい場合は、キャッシュされていないアプローチほど速くベースライン化されない可能性がありますが、データ セットが大きい場合はパフォーマンスが向上します。ここでは、操作の暗黙のパフォーマンス オーバーヘッドがありますが、標準の「ロード」パターンよりも遅い速度で低下します。

于 2010-06-24T09:05:17.720 に答える