7

Spring を使用しているプロジェクトがあり、数十の DAO と関連する DTO に分割されています。私は JdbcTemplate を使用していますが、それはまさに私が満足している抽象化のレベルであるため、他にはあまりありません。

私は現在、ゲッターにやや複雑なコードを配置して、DTO で遅延読み込みを実行しています。

基本的なボイラープレート ロジックは次のとおりです。 1. フィールドが null でない場合は、その値を返して終了します。 2. 適切な DAO に連絡し、関連する DTO を取得します。 3. 次回まで保存します。

私の低レベルの DTO が多数の DAO と組み合わされており、それほど POJOey ではないことを除けば、これは問題なく動作します。

ロジックをDAOに配置すると、DTOのCRUDと遅延読み込みの両方を処理するため、別のコードの匂いがします。私が理解しているように、オブジェクトは単一の責任を持つ必要があります。

これを実現するために、DAO と DTO の間に Lazy Loader オブジェクトを挿入するために使用できる比較的単純な Spring アプローチがあることを願っていますが、他のソリューションは私にとってはうまくいくでしょう。

何か案は?

4

2 に答える 2

4

DAOをDAOの周りにラップする方が簡単です...それは、どの程度のモデルを持ち込むかによって異なります。DTOは通常、2つ以上の個別のデータベース/ dao呼び出しとして、1対多を持ち込むために使用されることはありません。その場合、本当にORMが必要です。daoの答えを探しているので......

DAOをリンクして単一のDTOを提供することを妨げるものは何もありません。DTOをDAOに接続する方が簡単です。これは実際にはサービスレイヤーではなく、DAOの構成要素にすぎません。したがって、PersonDaoとTelephoneNumberDaoがあるかもしれません。1人の電話番号は複数持つことができるため、PersonDaoとTelephoneNumberDaoを内部で使用して作業を行うPersonModelDAoを使用することもできます。

または、問題全体を回避し、DTOレベルで人と電話番号の間の1-Nをマッピングしようとしないでください。UIに適切なDAOへの適切な呼び出しを行わせるだけです。私は実際、DTOを使用するときにこれがより好きです。

于 2009-01-29T13:25:13.873 に答える
3

DAO をラップし、そのような問題を処理するサービス レイヤーを導入するのが一般的です。遅延読み込みを処理するために DTO にボイラープレート コードを入れすぎているのではないかと心配している場合は、おそらく AOP を使用することでこれを実現できます。コンパイル時またはロード時のいずれかで AspectJ とウィービングを調べることをお勧めします。バイトコードを直接変更するため、プロキシベースの AOP のパフォーマンス オーバーヘッドについて心配する必要はありません。

于 2009-01-29T05:59:51.220 に答える