2010-12-17 16 views
3

クライアントが、データアクセスコードを実装して、実行時構成設定に基づいてOracleまたはSQLサーバーデータベースを使用する必要がある状況があります。本番環境ではOracleを使用しますが、開発者とQAの両方がSQL Serverインスタンスに対して実行されています。LINQとXYZの多型?

(私はこれ以上の任意のコントロールを持っているか、これは、Oracle以外の場合は、自分のBIプラットフォームとDEVは、SQL Serverで動作するように望んでいるある理由上の任意のバックグラウンドを持っていません。)

彼らの要求を使用することですすべてのデータアクセスに対して、LINQ-to-SQL/LINQ-to-Oracle彼らはアプリケーションをサポートする必要があり、まだEFに飛びつく知識はありませんが(私たちがEFを使用する場合、同じ問題が存在するとは思いますが)

両方のデータベースにLINQ to XYZクラスを実装することができますが、両方に接続できるので、共通インターフェイス(DataContext以外)を共有しないため、実際にインターフェイスに対してコードを作成したり、実行時の実装。

どのように私はこれにアプローチする必要がありますか?

UPDATE この記事を書いた後、私は少しEFに調査しなかったし、私がEF使用する場合は、この同じ問題が存在しているように私には見える - 私の長期的な目標になります。

答えて

0

は、ここで私がやってしまったものです:

私は仕事とリポジトリパターンのユニットの組み合わせを実装しました。 Unit of Workクラスは、コードを使用して、ルートエンティティで実行できるすべての操作を処理し、公開します。ルートエンティティごとに1つのUoWが存在します。 UoWは、インタフェースを介してリポジトリクラスを使用します。リポジトリの実際の実装は、使用されているデータアクセステクノロジに依存します。

私は顧客エンティティを持っていると私は、各レコードを取得し、更新をサポートする必要があるのであれば、例えば、私のようなものだろう:私は注入するコントロールフレームワークの反転を使用してい

public interface ICustomerManager 
{ 
    ICustomer GetCustomer(Guid customerId); 
    void SaveCustomer(ICustomer customer); 
} 

public class CustomerManager : ICustomerManager 
{ 
    public CustomerManager(ICustomerRepository repository) 
    { 
     Repository = repository; 
    } 

    public ICustomerRepository Repository { get; private set; } 

    public ICustomer GetCustomer(Guid customerId) 
    { 
     return Repository.SingleOrDefault(c => c.ID == customerId); 
    } 

    public void SaveCustomer(ICustomer customer) 
    { 
     Repository.Save(customer); 
    } 
} 

public interface ICustomerRepository : IQueryable<ICustomer> 
{ 
    void Save(ICustomer customer); 
} 

を実行時にCustomerManagerクラスにICustomerRepositoryを実装します。実装クラスは、データアクセステクノロジが変更されたときにスワップアウトできる別のアセンブリになります。私たちが懸念しているのは、リポジトリが上記で定義したコントラクトを使用して各メソッドを実装していることだけです。

Linq-to-SQLでこれを行うために、私は単にICustomerRepositoryを実装するLinqCustomerRepositoryクラスを作成し、ICustomerを実装する生成されたCustomerエンティティクラスの部分クラスを追加しました。次に、私はUoWのためのICustomerインターフェイスの実装として、L2Sエンティティをリポジトリから返すことができ、コードを呼び出すことはできません。エンティティがL2Sコードに由来することは賢明ではありません。

0

ちょっと考えました。 MEF frameworkを使用してDALレイヤーを接続します。環境(開発、生産、QA)に基づいて、さまざまなDALレイヤー(Oracle、SQLなど)に切り替えることができます。

MEFについて知りたい場合は、hereが簡単なイントロです。

またいつか私はGeneric Data Access FrameworkをJoydip Kanjilalによって見ました。あなたはそのことを見ることさえできます。

+0

MEFを使用しても、コーディングする共通のインタフェース/契約はありません。具体的なDALをアプリケーションに挿入する方法はたくさんありますが、MEFを含めてすべて、具体的な実装を知らなくてもアプリケーションをコーディングできるように共通の契約が必要です。私が知る限り、LINQ-to-SQLクラスを生成し、LINQ-to-Oracleクラスのセットを生成すると、共有コントラクト(インターフェイス、ベースクラスなど)はありません。実装とは何の関係もないので、良いことです。 – SonOfPirate

+0

一般的なデータアクセスフレームワークhttp://www.deitel.com/ResourceCenters/Programming/ADONET/ADONETDataAccessLayer/tabid/3176/Default.aspx –

+0

これは大きく後退したようです。私は、ADO.NETと、実際のプロバイダとは独立したコード化を可能にする抽象ファクトリパターンの実装に精通しています。しかし、現実にはこれまでのところしかない。私たちのSQLテキストで説明されなければならないプラットフォーム間の構文の違いがしばしばあります。これは、さまざまな構文要件に対応するために、ある時点で異なるコードを持つことを意味します。 – SonOfPirate

0

IDataContextのように、作成したインターフェイスにORMデータインターフェイスをカプセル化するだけです。

このインターフェイスをすべてのDAL間で共有し、実装します。どのようにプラグインするかは、MEFを推奨またはIoCコンテナとして使用するだけです。このトピックの閉鎖性のために