2011-12-15 10 views
0

Userというオブジェクトがあります。このオブジェクトはUsermapperによって生成されます。 Userオブジェクトは、使用しているデータベース/リポジトリについては何も知らない(私は良いデザインだと思う)。データベースとやりとりする関数のベストプラクティス

Userを作成するときは、マッパーによって最も些細なことで埋め尽くされるだけです。しかし、オブジェクトのインスタンス化後には、私はこの比較的高価な操作をすべてのユーザーのインスタンス化(複数のテーブルが必要など)に行わないようにするために、userX.getTotalDebt()のメソッドを持つかもしれません。getTotalDebt()はデータベースに再接続する必要があります。もし私が単にgetTotalDebt()にいくつかのSQLを挿入するか、または連結性が非常に速くなっているMapperへの依存関係に戻ってください。

状況が頻繁に発生するため、明らかに良い/ベストプラクティスがありますが、見つからないか、間違った角度からこの問題を完全に見ています。

答えて

0

私はUsermapperによって生成されたUserオブジェクトを持っているとします。 Userオブジェクトは、使用しているデータベース/リポジトリについては何も知らない(私は良いデザインだと思う)。

これらは、POCO(Plain Old CLR Objects)と呼ばれることがよくあります。

ユーザーを作成するときには、マッパーによって最も些細なことで埋められるようにしたいだけです。氏名、住所など

これを達成できるいくつかのOR/M層があります。 nhibernateまたはEntity Framework 4.1コードファーストのいずれかを使用します。

私は方法userX.getTotalDebt()を持っているかもしれませんが、getTotalDebtは()そして、それはもうPOCOないデータベース

に再接続する必要があります。透明なプロキシを使用することは可能ですが。 EFとnhibernateの両方がこれをサポートしており、Lazy Loadingと呼ばれています。

このため明らかに良い/ベストプラクティスは、それは状況がしばしば発生しますので、しかし、私はそれを見つけることができないか、私は間違った角度から完全にこの問題を見てよ、あり

私は通常、私のオブジェクトをダムにして、切断します。クラスをテスト可能にするので、リポジトリパターンを使用します(たとえnhibernateまたは他のormを使用しても)。

私はリポジトリクラスを直接使用するか、すべてのロジックを含むサービスクラスを作成します。私のアプリケーションがどれほど複雑かによって異なります。

+0

次に、あなた/ ORMはどこでgetTotalDebt()メソッドの機能を実装しましたか?マッパーでのインスタンシエーションでは、具体的には、データベースにもっと多くのテーブルを追加することによって?私はあなたがあまりにも透明なプロキシ/レイジーの読み込みメソッドを嫌い行の間で読んだので。 – hbogert

+0

レイジーローディングは、データベース例外をデータレイヤーの外に移動させ、慎重ではない場合に多くのSQLクエリを生成する可能性があります。結合を行い、完全なリストを返す方がよいでしょう。 – jgauffin

+0

これまでの洞察をありがとう。これまでのところ私は参加ソリューションにはかなり満足していました。しかし、これはかなり面倒なことになってきています。既に私は、オブジェクト作成を遅くしているgroupby節を使用し始めています。 – hbogert

関連する問題