2011-04-12 7 views
0

最初にSQL Server 2008をDBMSとして使用するアプリケーションを構築しています。どのようにしてアプリケーションを構造化し、後で別のDBMSを使用できるようにするべきですか?オラクル、私のコードを変更することなく、すなわち構成のみを介して。「プラグイン」データアクセスレイヤーを使用できる.Net Webアプリケーションを構築するためのガイドライン

私のコアアプリケーションは、アプリケーションが機能するために必要なすべてのデータベース呼び出しをカプセル化するアセンブリ/レイヤーでコードを呼び出すと思われます。このレイヤーは、実際のDBコールを行うために、(configに基づいて)DBMS固有のレイヤーを呼び出します。誰かがこれの明確な例を私に指摘することはできますか?

ありがとうございます!

は、以下の説明を追加しました:

私の考えは、私は、例えば複数のアセンブリを持っているということでしたMyAppを、MyApp.Database、MyApp.Database.SQLServer、MyApp.Database.Oracleなど

MyAppには次のように電話をかけるでしょう。

...のように見えた...

DataSet ds = MyApp.Database.GetSomeData(); 

public DataSet MyApp.Database.GetSomeData() 
{ 
    return GetDataFromDBMS(); 
} 

GetSomeDataは一般的な呼び出しです。つまり、何かを行うにはMyAppに「GetSomeData()」が必要です。データがどこから来たかは気にしません。

次に、GetDataFromDBMSは、構成ファイルを介して、MyApp.Database.SQLServer.GetTheData()またはMyApp.Database.Oracle.GetTheData()のいずれかを呼び出します。これらのメソッドは、各DBMSからデータを取得/処理するために必要な処理を実行できます。

+1

私はアプリケーションで開発したいと思っています**実際には**データベースレイヤーを交換して、このタイプの機能性は価値があります。悲しいことに、これまでのところ私のキャリアの中では決してなかった。 – BenCr

+0

コメントのための@BenCr +1;このようなことについて多くの時間を費やしている*特にその中のほとんどすべてを行うフレームワークが非常に多い初心者/アマチュア開発者だとわかります。 –

+0

@BenCr - Andrew Barberはここに隠れた議題を持っています。私たちは意見の不一致があり、私は彼が上記の彼のコメントに例示されている "遊び場の戦術"を非難したと思いませんか?彼のコメントを削除する習慣があるので、私はここでそれを引用します: "...私は、通常、このようなことを考えるのに多くの時間を費やしている初心者/アマチュア開発者だと感じています... " – jqwha

答えて

2

あなたがしなければならないことは、データベースを抽象化する(nHibernate)ORMツールを使用するか、DALを表すインターフェイスセットを定義してから、IoC実装(Ninject、Castleなど)を使用してインタフェースを実装している限り、基本となる実装を自由に交換してください。

しかし、将来的に証明される(つまり、他のデータベースを扱う微妙な癖に対処できる)インタフェースを設計することは簡単ではないので、変更する必要が生じる可能性があります。

私はこの順序で、2つのうちのいずれかの操作を行いたい:

  1. レビューをお本当にはデータベースを交換する必要がある場合。
  2. 多くの脚作業が行われているので、ORMツールのルートを行ってください。

データベースの抽象化の良い例として、必ずしもDAL per-seである必要はありませんが、Microsoftのエンタープライズライブラリデータアクセスアプリケーションブロックです。

+0

この理由は、アプリケーションをDAABはプロバイダを切り替えることができますが、DBMS固有のすべてのロジックをDBMS自体に戻します(つまり、各DBMS内で同じ名前のprocsを呼び出す)。おそらくそれは良いことですしかし、私は、DBMSコールのプリ/ポストプロセスにカスタムの.Netコードが必要な状況を想定することができます。少なくとも1つのアセンブリレイヤを入れ替えする方法を知りたい これを行う。 – jqwha

+0

実際には、コアアプリケーションが必要とするすべての呼び出しを含むインタフェースを実装するSQLオブジェクトまたはOracleオブジェクトのいずれかを返す「DALFactory」のようなものを使用してこれを行うことはできませんか? – jqwha

+0

@jqwhaこれは、IoCフレームワークを使用することで得られる解決策になります。インターフェースの背後にある設定されたオブジェクトを要求しますが、コード内でのみインターフェースを使用します。インターフェイスベースのプログラミングには限界がありますが、通常は問題は発生しません。これを販売している場合は、インターフェイスを定義するのに多くの時間を費やしてしまいますが、破損することなく変更することができない可能性があります。 –

関連する問題