0

その後、多くの小さなアプリケーションから使用できるデータ アクセス ライブラリを構築する必要があります。

DataReader オブジェクトを多用します。テーブルは、SQL Server または DB2/400 のいずれかに同じ構造で存在する場合があります。これは、たとえばメソッドが

GetItemsByWarehouse()

SQL Server DB または DB2 に対して実行できる必要があります。どこで実行されるかは、サーバーの可用性とユーザーの選択によって異なります。

私がやろうとしていること(そしてそれについてのアドバイスが必要です)は:

  1. シングルトン デザイン パターンに基づいて DAL を実装し、ライブラリのインスタンスが 1 つだけになるようにします。
  2. 接続文字列を設定するプロパティがあります。
  3. ターゲット サーバーが AS400 または SQL の場合に設定されるプロパティがあります。

この一連の行動が正しいかどうかはわかりません。ポイント#3を実装する必要がありますか、それとも接続文字列からタイプを取得できますか?

また、上記のようなメソッドをどのように実装すればよいですか? プロパティを確認し、メソッド内で使用するSqlconnectionかどうかを決定しOleDbConnectionますか?

4

2 に答える 2

2

このコードをマイクロOrmから貼り付けます。使用するDbを指定するために、コンストラクターには複数のオーバーロードがあります。

 public class DbAccess : IDisposable
{
    public DbAccess()
    {
        var cnx=ConfigurationManager.ConnectionStrings[0];
        if (cnx==null) throw new InvalidOperationException("I need a connection!!!");

        Init(cnx.ConnectionString,ProviderFactory.GetProviderByName(cnx.ProviderName));
    }

    public DbAccess(string connectionStringName)
    {
        var cnx = ConfigurationManager.ConnectionStrings[connectionStringName];
        if (cnx == null) throw new InvalidOperationException("I need a connection!!!");

        Init(cnx.ConnectionString, ProviderFactory.GetProviderByName(cnx.ProviderName));
    }

    public DbAccess(string cnxString,string provider)
    {
        Init(cnxString,ProviderFactory.GetProviderByName(provider));
    }

    public DbAccess(string cnxString,DBType provider)
    {
      Init(cnxString,ProviderFactory.GetProvider(provider));
    }

    public DbAccess(string cnxString,IHaveDbProvider provider)
    {
        Init(cnxString, provider);
    } //other stuff
   }

DAO(DbAccess)は具体的なプロバイダーを気にしないことに注意してください。ProviderFactoryの外観は次のとおりです。ここで、データベースを検出してプロバイダーを返すメソッドを追加できます。

   internal static class ProviderFactory
{
    public static IHaveDbProvider GetProviderByName(string providerName)
    {
        switch (providerName)
        {
            case SqlServerProvider.ProviderName:return new SqlServerProvider();
            case MySqlProvider.ProviderName:return new MySqlProvider();
            case PostgresProvider.ProviderName:return new PostgresProvider();
            case OracleProvider.ProviderName:return new OracleProvider();
            case SqlServerCEProvider.ProviderName:return new SqlServerCEProvider();
            case SqliteProvider.ProviderName:return new SqliteProvider();
        }
        throw new Exception("Unkown provider");
    }

    public static IHaveDbProvider GetProvider(DBType type)
    {
        switch (type)
        {
            case DBType.SqlServer: return new SqlServerProvider();
            case DBType.SqlServerCE: return new SqlServerCEProvider();
            case DBType.MySql: return new MySqlProvider();
            case DBType.PostgreSQL:return new PostgresProvider();
            case DBType.Oracle:return new OracleProvider();
            case DBType.SQLite:return new SqliteProvider();
        }
        throw new Exception("Unkown provider");
    }
}

その他のコードスニペットとインスピレーションについては、Githubリポジトリを確認してください

シングルトンパターンに反対することをお勧めします。インスタンスの寿命を管理するためにDIコンテナを使用する方がはるかに優れています。また、アプリは具体的なインスタンスではなく、DAOのインターフェースを使用する必要があります(これは将来的に役立ちます)。

于 2012-11-14T12:50:25.433 に答える
1

Abstract Factory パターンをご覧ください。

DAL コントラクトとのインターフェイスと、各コンテキストの実装を持つことができます。Factory を使用すると、それぞれの場合にどの実装を使用するかを決定できます。ファクトリは、何を使用するかを決定するために「スイッチ ルール」を必要とします。

于 2012-11-14T11:17:45.140 に答える