2013-01-24 8 views
5

私はプロジェクトを開始しており、データアクセスレイヤーのアーキテクチャに苦労しています。基本的には、異なるデータベース設計の複数のバックエンドとのインタフェースが必要です。複数のバックエンドと異なるデータベース設計を持つデータアクセスレイヤー

普通のDALが好きですが、これはどんなバックエンドでも共通の機能を実行します。バックエンドには、挿入、更新などのためのユニークなコードがあります。したがって、1つのバックエンドに従業員を追加すると、別のコードに別のコードが追加されます。

私はリポジトリパターンを試しましたが、その状況には当てはまりません。私はちょうどファクトリパターンメソッドで終わったが、私は各オブジェクトのファクトリを作成することになります。 DALのプロジェクトで

DAL 
    --> DAL.Backend1 
     --> Employee.Save(employee) 
     --> Plan.Save(plan) 
    --> DAL.Backend2 
     --> Employee.Save(employee) 
     --> Plan.Save(plan) 

:私は以下の持っている今など、

を私は多分唯一の1つの工場を作成することもできますが、その後バックエンドのオブジェクトは、「SaveEmployee」、「SavePlan」のような機能の百を持っているでしょう私は各オブジェクト、従業員、計画のためのファクトリパターンを持っており、どのDALのオブジェクトを返して実行するかを決定します。

これはこのための最良のアーキテクチャではないと私は確信していますので、私の問題を解決するためのより良いパターンがあるのだろうかと思います。

+0

完全に動的で動的にCRUDステートメントを作成することは少ないので、具体的な機能をどこかに配置する必要があります。データベースに入れたくない場合は、あなたが行ったルートが最善のルートだと思います。 –

+0

私は通常、複合パターンになりがちです。 – Malk

+1

「異なるデータベース設計」を定義します。つまり、1つはSQL、1つはXML、もう1つはNoSqlです。あるいは、さまざまなリレーショナルデータベースについて話しますか? – TomTom

答えて

0

私たちはこのプロジェクトの1つでこの機能を実装しました。私はそれが最良の解決策であるかどうかはわかりませんが、これまでのところ私たちのために働いています。ただし、私たちのためにCRUDクラスを生成するCodeSmithテンプレートに基づくカスタムDAOレイヤーがあります。基本的には、すべてのユーザーの接続ブローカーを表すシングルトンを作成しました。ユーザーがログインすると、接続先のデータベースが選択されます(一部のIPフィルタリングではオプションが絞り込まれますが理想的には1になります)。ログインは関連付けられたユーザーとの接続トークンを格納し、生成されたDAOレイヤの基本クラスは接続ブローカーを呼び出して適切な接続文字列を取得します。 DAOオブジェクトが呼び出されるたびに、DAOオブジェクトがDBに接続しようとする前に接続文字列が収集されます。

関連する問題