Persistence-Ignorantオブジェクトは遅延読み込みを実装できますか?


12

永続性無知は、単一の責任原則のアプリケーションです。実際には、ドメインオブジェクト(DO)に永続性に関連するコードを含めるべきではなく、ドメインロジックのみを含める必要があります。

a)これは、下位層(つまり、永続層)に接続するコードが、ビジネスロジック層の他のクラス(OC)のドメインモデルの外側にあることを意味すると思いますか?

b)の下で、私の仮定した場合正しいこと、そしてDOたとえば、Customer、決してなどの方法が含まれていませんGetCustomersGetCustomerByID

c)a)およびb)の下での私の仮定が正しく、Customerドメインオブジェクトがそのプロパティの一部に遅延読み込みを使用すると仮定すると、ある時点でCustomer内部ロジックがOCに連絡し、次にOCが遅延データを取得する必要があります。しかし、遅延データを受け取るためにOCCustomerに連絡する必要がある場合、ドメインオブジェクトに永続性に関連するロジックが含まれていないことを主張することはできません。

ありがとうございました

jkohlheppへの返信

1)クラスはビジネスロジック層に含まれているOrderProviderと思いCustomerProviderますか?

2)b)の下での私の仮定が正しいというあなたの返事から集めますか?

3)

...いくつかの非公開注文フィールドが入力されているか、それがヌルであるかを確認します。nullの場合...

しかし、私が知る限り、ドメインコードがプライベートorderフィールドに入力されているかどうかを確認する必要があるとすぐに、もしそうでない場合はOrderProviderに問い合わせると、すでにPIの原則に違反していますか?!

回答:


4

永続性の無知に関するAとBの仮定は正しいと思います。

データベースオブジェクトの遅延読み込みを最適に実現する方法は、特定の問題と実装に大きく依存します。ただし、永続性とドメインロジッククラス間の懸念の分離を維持しながら、遅延読み込みを行う方法に対する一般的な回答を試みます。

私は、次のクラスを使用して永続性の無知を実装する傾向があります。

  • ドメインクラス-例:顧客
  • プロバイダー/リポジトリクラス-例CustomerProvider
  • 汎用データベースクエリクラス-DatabaseQueryなど

DatabaseQueryクラスは、データベースドライバーを使用してデータベースを照会し、結果のデータをDataTableなどの一般的な結果セットにアセンブルします。CustomerProviderは、DatabaseQueryクラスを使用してデータベースに対してSQLを実行し、そのSQLの結果を使用してCustomerインスタンスをアセンブルします。顧客は、顧客に関連するデータとロジックを含む「純粋な」ドメインオブジェクトです。

プロバイダークラスがビジネス層にあるべきかデータ層にあるべきかについて、私は強い意見を持っていません。両方のケースを見ることができます。重要な部分は、クラス間で責任を分離することです。

それでは、遅延読み込みについて説明しましょう。たとえば、CustomerにOrderのコレクションを持たせたいが、消費者がOrderにアクセスしようとしない限り、データベースからOrderを引き出したくないとしましょう。注文と呼ばれる顧客のプロパティを作成します。そのプロパティのゲッターで、いくつかのプライベートオーダーフィールドが入力されているか、またはnullであるかを確認します。nullの場合、OrderProviderを使用してデータベースから注文を読み込みます。それ以外の場合は、すでにロードされているコレクションを返すだけです。

私の意見では、顧客がOrderProviderに連絡する必要はPIに違反しませ。顧客はまだ注文を受け取る方法を知りません。OrderProviderから取得することを知っているだけです。OrderProviderからCustomerを切り離す他の理由があるかもしれませんが、ここではPIが問題だとは思いません。

これは、手動で永続化の無知を行っていることを前提としています。Entity FrameworkやHibernateなどのORMフレームワークを使用している場合、これらのフレームワークには通常、遅延読み込みを自動的にサポートする機能があります。


こんにちは、あなたは時間を見つける場合には-私はあなたの答えへの応答で私のポストを編集した
user1483278

1
@ user1483278答えを編集して、これらの質問に対処することを望みます。
RationalGeek

PIは何の略ですか?
クーゲル

持続性の無知
RationalGeek

2

ドメインオブジェクト(たとえば、「リポジトリ」と呼ばれるもの)にデータを取り込むワイヤリングクラスがあります。遅延読み込みまたは任意の種類のキャッシュ一貫性スキームを実装でき、ドメインオブジェクトは賢明ではありません。ドメインオブジェクトを作成する責任とドメインオブジェクトである責任を分離しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.