質問

DAOを定義するときに

通常、あなたは、DAOオブジェクトのデータソースのセッターを持っているでしょう。 私の問題は、私たちのデータソースがサーバーへの要求に基づいて動的に変化することです。すなわち、すべての要求は、別のデータベースインスタンスにアクセスすることができます。

要求は、後で要求のDBへの接続を取得するために使用することができる論理的な特性を保持しています。

だから、依存性は、ビジネス・ロジック・オブジェクトにDAOを注入するとき、私は(時間設定ではありません)、実行時にDAOのプロパティを設定する方法が必要です。

一つの解決策は、ローカルスレッド上のデータソースを格納することですが、私は本当にスレッドローカル変数をいじりが好きではありません。

は別のオプションは、要求特性を持つDAOに初期化する呼び出し、ビジネス・ロジック・オブジェクトのinitializeメソッドを持つことです。

私はそれが一般的な問題だと思う、あなたは一般的な解決策を提案することができますか?

役に立ちましたか?

解決

あなたの問題は、あなたのアプリケーションのための単一のDAOのインスタンスを作成しているということであるように、

これが鳴ります。あなたは(あなたのためにすべてを管理するために、多分DAOコントローラのいくつかの種類を作る)各データソースに対して個別のインスタンスを作成する必要があるか、おそらくあなたのDAOであなたのメソッドは静的であるととともに、データソースへの接続方法に関するすべての情報を渡すことができますいずれかデータはあなたがすべてのメソッドに永続化されます。

他のヒント

あなたの問題は少し混乱しています。 1回のDAOのアクセス、複数の異なるデータソースを持つことは、メンテナンスの悪夢であるように見えるでしょう。その結果、あなたが呼び出したいでしょうすべてのメソッドを含む1つのDAOインタフェースを定義する必要があります。各データベースについて、あなたは私に接続しているあなたのDAOインタフェースを実装する新しいクラスを構築します。これは、複数の実装を持つことができます。私は、マップのキーとしてあなたの「論理プロパティ」を使用して、マップ(java.util.Map)で、これらの実装(独自のデータソースを持っている各)を格納します。すべてのDAOの実装は、あなたのインターフェイスを実装しているので、あなたは、インターフェイスにそれらをキャストし、同義的にそれらを使用することができるようになります。あなたのビジネスオブジェクト上では、DAO実装の地図を注入します。私はこれがあなたのデザインに役立ちます願っています。

あなたがこのクラスに見てみたいことがあります:

ます。http: //static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.htmlする

あなたのサービスオブジェクトとデータアクセスオブジェクトのために簡単に動的なデータソースのいずれかの概念が存在することを知らないようになります。

通常は、サーブレットフィルタを実装し、AbstractRoutingDataSourceで使用されるDataSourceLookupの実装が簡単に返されるデータソースを指示するリクエストパラメータへのアクセスを得ることができるようにThreadLocalを使用する必要があるだろう。あなたが本当にそれを避けたい場合は、リクエストスコープのBeanのプロパティを設定するサーブレットフィルタを実装し、あなたが書いたDataSourceLookupの実装にそのBeanを注入できます。リクエストスコープのBeanは、まだ彼らの実装でのThreadLocalを使用しますが、少なくともこの方法は、それはあなたが、SpringのIMPLだではない、とあなたはそれを心配する必要はありません。 :)

同様のアプローチは、春のチームから、このブログのエントリで詳述されます:

http://blog.springsource.com/2007/01 / 23 /ダイナミックデータソースルーティング/

私は、クライアント/サーバープロジェクトで、このような問題を抱えていました。クライアントとサーバーのプロジェクトは、ダオ・インタフェースを共有しました。私は、データベース操作を行うために使用する場合、私は、適切なDAO実装を選択する必要がありました。私のソリューションは、このようなものだった。

IVehicleDao vehicleDao =daoFactory.Get<IVehicleDao>(parameters);
vehicleDao.doSomething();

.. DAO実装を返すためにどの決めるparameters.Insideダオ工場を渡すことで、工場からDAOを取得します

私はすでにこれをやりました。あなたは1つのDAO各クラスを作成する必要があり、そしてあなたのDAOの範囲に、あなたがDAOへの動的な呼び出しを行うDATASOURCE、最終的に1つのクラスCONTROLLERを渡す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top