2

私のクラスには次のコアがあります。

class SmartDbConnection
{
    private readonly IDbConnection Connection;

    public SmartDbConnection(string ConnectionString)
    {
        if(ConnectionString.Contains("MultipleActiveResultSets=true"))
        {
            Connection = new SqlConnection(ConnectionString);
        }
    }
}

「SqlConnection」をハードコーディングしたくありません。だから私はそれをジェネリッククラスにすることを考えました(IDbConnectionクラスを受け入れます)。しかし、私はそれを行う方法がわかりません。誰でも助けることができますか?

4

5 に答える 5

10

まずIDisposable、重要だと思うので、これに追加しました。

次に、プロバイダーはここでは代替であることに注意してください。

class SmartDbConnection
{
    private DbConnection Connection;

    public SmartDbConnection(string provider, string connectionString)
    {
        Connection = DbProviderFactories.GetFactory(provider)
            .CreateConnection();
        Connection.ConnectionString = connectionString;
    }
    public void Dispose() {
        if (Connection != null)
        {
            Connection.Dispose();
            Connection = null;
        }
    }
}

ジェネリックに行かなければならない場合は、どうですか:

class SmartDbConnection<T> : IDisposable where T : class,
    IDbConnection, new()
{
    private T Connection;

    public SmartDbConnection(string connectionString)
    {
        T t = new T();
        t.ConnectionString = connectionString;
        // etc
    }
    public void Dispose() {
        if (Connection != null)
        {
            Connection.Dispose();
            Connection = null;
        }
    }
}
于 2009-01-16T14:00:33.893 に答える
8

ctor への接続文字列の代わりに IDbConnection を受け入れてみませんか?

于 2009-01-16T13:59:19.527 に答える
2

多分...

class SmartDbConnection<T> where T : IDbConnection, new()
{
    private readonly IDbConnection Connection;

    public SmartDbConnection(string connectionString)
    {
        if (connectionString.Contains("MultipleActiveResultSets=true"))
        {
            Connection = new T();
            Connection.ConnectionString = connectionString;
        }
    }
}

編集:しかし、kaanbardakが提案することはさらに良いかもしれません...

于 2009-01-16T13:59:39.400 に答える
1

そこに SqlConnection を指定したくない場合は、どこに指定しますか? また、接続文字列に "MultipleActiveResultSets=true" が含まれている場合にのみ、それを使用することをどのように知ることができますか?

あるレベルで、接続ファクトリが必要だと思います-Func<string, IDbConnection>どこかに渡すか設定できるか、または単にクラスのいずれかです。

public static class ConnectionFactory
{
    public static IDbConnection CreateConnection(string connectionString)
    {
        // Hard-code stuff here
    }
}

もちろん、それらは同じコインの裏表にすぎません。ConnectionFactory は、Func<string, IDbConnection>.

于 2009-01-16T14:00:17.247 に答える
0
  class SmartDbConnection<T> where T: IDbConnection , new()
  {
    private readonly T Connection;

    public SmartDbConnection(string ConnectionString)
    {
      if (ConnectionString.Contains("MultipleActiveResultSets=true"))
      {
        Connection = new T();
        Connection.ConnectionString = ConnectionString;
      }
    }
  }
于 2009-01-16T14:03:57.753 に答える