私はリポジトリのパターンを見てみることをお勧めします。リポジトリパターンを使用すると、アプリケーションをインフラストラクチャから抽象化することができます。これにより、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の実装が変更される理由は複数あります!
しかし、これがあなたが必要とするものなら...それを行う方法があります!