2015-10-05 11 views
5

アプリケーションで作業しているとき、特に適切なOODパターンとDDDパターンに従うときに、Customerなどのドメインクラスが生成されることがあります。それから、このオブジェクトをロードするいくつかのリポジトリがあり、すべてが素晴らしく清潔です。ドメインオブジェクトのアンダーロードを処理する共通のDDDパターンはありますか?

アプリケーションが複雑になり、パフォーマンスが最適化されます。 Customerオブジェクトのリストをロードする必要はほとんどありませんが、IDと名前、またはプロパティの小さなサブセット(たとえば、グリッド内に表示するなど)を実際にロードする必要がない状況で自分自身を見つけることがあります。

私はよく見ている

ソリューションが含まれます:

  1. アンダーロードドメインオブジェクトを、ので、基本的に我々はまだCustomerクラスを使用しますが、我々はそれらをロードするために別のリポジトリメソッドを使用して、そのリポジトリメソッドがロードしデータベースからは必須フィールドのみを検索し、オブジェクトの対応するプロパティに値を設定します。残りのCustomerフィールドはデフォルト値のままです。これは簡単な解決策ですが、開発者(または既存のコード)が特定のプロパティを読み込むことが予想される場合、多くのエラーが発生する可能性があります。私たちは私たちに必要なプロパティのみが含まれ、このようなCustomerIdNameCustomerInfoCustomerHeaderなどのクラスを作成

  2. 目的-クラス分け。このアプローチでは多数のクラスを作成できますが、慎重なサブクラス化は実行可能です。しかし、それはユビキタスドメイン言語のコンセプトから取り除かれているようです。

DDDの世界でそれらを処理するためのいくつかの一般的な合意がありますか?私はこれをgoogleにしようとしましたが、権威あるものを見つけることができませんでした。

これは古典的なDDDアプローチの周知の制限事項に過ぎず、CQRSや他のアプローチがこれらのシナリオでは良いでしょうか?

答えて

5

私は第二のアプローチは行く方法だと思います。 私たちのプロジェクトではそうしたやり方をしていますが、読み込み専用のDTOクラスについてのみ行っています。あなたが挿入/更新のためにそれらを使用していない限り、それはちょうどいいと思います。

あなたは多分に興味answerこともあります:

+0

ありがとう、あなたがリンクしている答えは、私が直面しているのとまったく同じ問題です。これについてもう少し考える必要がありますが、特定のアプリケーションクエリのドメインモデルをバイパスするという概念は非常に興味深い解決策です。 –

+0

参照:[レイジーローディングはデザインの匂いです](https://books.google.com/books?id=9ebGBwAAQBAJ&pg=PA507#v=onepage&q&f=false) – Ritesh

0

Entity Frameworkについて調べましたか?彼らはエンティティ遅延読み込みの複数のレベルを持っています:MSDN Post

+0

はい、私たちは実際には(外部Webサービスなどの他のソースの中で)EFを使用しています。実際に作業しているドメインオブジェクトが実際にEntity Frameworkから提供されているかどうかを覚えておく必要があります.EF接続を中断することなく、セッションにシリアル化するなどの特定の作業はできません。 –

2

それはDDDのよく知られた制限だとCQRSはそれを解決するために非常に良い方法です。読み出し側の

CQRSは基本的に変更可能なドメインエンティティを読み取りモデルの混乱を避けるためにすべての必要な予防措置との溶液#2:なぜ荷重下など彼らのために無リポジトリ、読み取り専用のクラス、

+0

ありがとうございます、今はもっと意味があります –

0

私は理解していません問題になる可能性があります。あなたは無効なフィールドを知っているのでアクセス/遅延ロードをブロックできます

+0

例として、開発者がページAに顧客がどのように読み込まれるかを変更する必要があるとしましょう。今は特定のフィルタを適用する必要があります。彼は、メソッドを使用するように、指定されたフィルタを使用して顧客をロードするメソッドが既に存在することを発見しました。しかし、テスト中にページが削除された顧客を特に無視しても、削除された顧客が表示されるようになりましたか?どうして?まあ 'deleted'は読み込まれなかったブール値のプロパティであり、デフォルトではすべての顧客が削除されていないように見えます。これは人為的な例のように見えるかもしれませんが、そのような状況が起こります。 –

+0

遅延ロードも問題があるかもしれませんが、私が遭遇した問題は、Entity Contextがすでに破棄されている、ビューがナビゲート可能な遅延ロードされたプロパティにアクセスしようとしたとき、または遅延リストされたプロパティを大きなリストで1つずつ呼び出すときに、 。 –

+0

すべては問題ではない、つまり機能しない実装と思われます。ロードされていないプロパティを呼び出すことはできません。プロキシはエラーを返すだけです –

関連する問題