0

さまざまな ADO.NET プロバイダーの違いを隠し、次のような多くのコードを持つ dll があります。

private static void AppendProviderSpecificParameterCmdStr(StringBuilder sb, DbCommand cmd, string fieldNameToUse, ComparisonOperator oprtr, string parameterName)
{
    if (cmd is System.Data.OracleClient.OracleCommand || cmd is Oracle.DataAccess.Client.OracleCommand)
    {
        sb.AppendFormat("{0}{1}:{2}", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd), parameterName);
    }
    else if (cmd is SqlCommand)
    {
        sb.AppendFormat("{0}{1}@{2}", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd), parameterName);
    }
    else if (cmd is OleDbCommand)
    {
        sb.AppendFormat("{0}{1}?", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd));
    }
    else
    {
        throw new Exception(string.Format("Wrong database command type: {0},", cmd.GetType()));
    }
}

ここで、比較演算子は自分の列挙型です。

Oracle.DataAccess は、Oracle クライアントを備えたすべてのマシンに存在し、このコードは私のニーズには問題ありません。しかし今、私は SqlClient しかなく、Oracle をまったく必要としない状況に直面しました。したがって、私のコードは、当然恐ろしいソリューションである Oracle.DataAccess.dll をコピーした場合にのみ機能します。これはどのように正しい方法で行うべきですか?

ありがとう - マティ

4

2 に答える 2

1

私はdllへの依存を恐ろしい解決策とは呼びません。あなたのソリューションはOracleをサポートしているため、ソリューションにOracle dllがあります-それはそれです。

そうは言っても、コマンドの種類を抽象化してできることがあります。

1 つ - インターフェイスを実装する完全なデータ アクセス メソッドを作成します。あなたの現在のソリューションは、一般的なデータアクセスのためのヘルパーまたはユーティリティメソッドに分類されます。代わりに、ICustomerDA のように、ドメイン (顧客など) に固有のインターフェイスを宣言することもできます。あなたの場合、 ICustomerDA.Insert の3つの実装があり、データベースの詳細が内部に埋め込まれています。メイン コードは、ICustomerDA についてのみ知る必要があります。これはおそらく、RDBMS 間の違いと機能がパラメーター宣言をはるかに超えているため、より大きなソリューションで行うことです。

2 - ヘルパー/ユーティリティのアイデアをもっと使いたい場合は、DB オブジェクトのラッパー用のインターフェイスを作成できます (IDBCommand など)。実装 IDBCommand は、基になるコマンド オブジェクトを非表示にし、次のようなことができる .AppendProviderSpecificParameterCmdStr メソッドの特定の実装を持ちます。

OracleDbHelper : IDbCommand...
  public void AppendProviderSpecificParameterCmdStr(...){
    sb.AppendFormat("{0}{1}:{2}", fieldNameToUse, GetComparisonOperatorStr(oprtr, cmd), parameterName);
  }

IDBCommand cmd = DAFactory.GetCommand();
cmd.AppendProviderSpecificParameterCmdStr(...

これらのソリューションの両方の鍵は、個々の型ではなく、メイン プロジェクトから共通のインターフェイスによって参照することです。これを行ったら、ファクトリでリフレクションを使用するか、 MEFのようなものを使用して実際の型を作成できます。

于 2013-03-11T18:54:16.227 に答える
0

したがって、私のコードは Oracle.DataAccess.dll をコピーした場合にのみ機能します

たとえば、すでに Oracle クライアントをインストールしているなどの理由で、ネイティブの OCI DLLも持っている場合を除きます。

ユーザーに完全な Oracle クライアントのインストールを強制することを避けるために、アプリケーションと一緒にOracle Instant Client から DLL を配布できます。ユーザーが Oracle に接続することを決して選択しない場合、これらの DLL は呼び出されず、問題を引き起こすことなく静かにそこに留まります。

何を配布するか、および 32 ビットと 64 ビットの両方をカバーする方法についてのヒントについては、この投稿をご覧ください。

現在、Oracle および MS SQL Server で動作する独自の抽象化レイヤーがあり (適切な ADO.NET プロバイダーを使用すると、任意の DBMS に移植可能です)、このシステムはこれまでのところ非常にうまく機能しています。

于 2013-04-08T19:40:39.930 に答える