2009-06-27 9 views
6

私は、SqlServerとOracleで動作するはずのアプリケーション用のデータベースファクトリパターンを作成しています。データベース複数のデータベースを持つファクトリパターン

http://www.primaryobjects.com/CMS/Article81.aspx

さて、問題は、私のアプリケーションは、同じサーバー上で複数のデータベースと通信していることである:私は次の記事で提案されている同様のアプローチを使用しました。例えば、私はデータベースDB1に対していくつかのクエリを実行しており、SqlServer上ではDB2に対してクエリをほとんど実行していません。上記の記事を使用して、私は1つのデータベースのインスタンスを作成することができました。同じ方法を使用して、複数のデータベースを操作するにはどうすればよいですか。誰か助けてくれますか?ありがとう。

答えて

3

私はリポジトリのパターンを見てみることをお勧めします。リポジトリパターンを使用すると、アプリケーションをインフラストラクチャから抽象化することができます。これにより、1つ以上のデータベース、Webサービス、ファイルシステム、またはドメイン外にある他のデータソースやアプリケーションが直接制御できるようになります。これにより、背後にある複数のデータソースと通信できるインフラストラクチャを構築できます。その一例として、私が最近取り組んだ電子商取引アプリケーションがありました。これは、直接製品カタログのローカルデータベースと話すことを可能にしました。また、新しい受注/ロギングの記録の背後でSAPと話しました。これにより

あなたはこのようになりますリポジトリに呼び出すコードを持っているかもしれません:

AccountRepository _repository = new AccountRepository(); 
Account account = _repository.GetAccountByID(32); 

それとも、の線に沿って何かを言うことができます。

Account account = new AccountRepository().GetAccountByID(32); 

の基本的な考え方をリポジトリは、アプリケーションが呼び出して、必要なデータを取得できることです。実際のドメインオブジェクト(上記の例のAccountなど)が返されます。または、口座の一覧が必要な場合はIEnumerable<Account>を返すことができます。

(私はこのような共同混入の懸念を示唆していないが)あなたは2つのデータソースからのデータをつかむこれの実装は次のようになります。このような状況のため

public class AccountRepository 
{ 
    public Account GetAccountByID(int accountID) 
    { 
     Account result = null; 

     using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB1)) 
     { 
      result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault(); 
     } 

     //result is null...go to the other database to get an Account 
     if(result == null) 
     { 
      using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB2)) 
      { 
       result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault(); 
      } 
     } 

     return result; 
    } 
} 

私の好みは次のようになりアプリケーションロジックを処理するアプリケーションサービスレイヤーを作成します。リポジトリは、技術的には1つのデータソースに関係している必要があります。あなたは、カップルの異なるデータソースのためのいくつかの異なるリポジトリを持つことができます。アプリケーション層では、リポジトリ1(データベース1)からGetAccountByIDのインスタンスを新規作成し、nullの場合、アプリケーション層は2番目のリポジトリ(たとえばデータベース2)に落ちます。可能であれば、リポジトリはSOLIDの原則に従うべきです。私の例が明確にSOLIDアプローチを打ち破るところでは、GetAccountByIDの実装が変更される理由は複数あります!

しかし、これがあなたが必要とするものなら...それを行う方法があります!

関連する問題