Как сделать этот класс универсальным? (.NET C #) - PullRequest
2 голосов
/ 16 января 2009

Мой класс имеет следующее ядро:

class SmartDbConnection
{
    private readonly IDbConnection Connection;

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

Я не хочу, чтобы в SqlConnection был прописан жесткий код. Поэтому я подумал о том, чтобы сделать его родовым классом (принимая классы IDbConnection). Но я не знаю, как это сделать. Кто-нибудь может помочь?

Ответы [ 5 ]

10 голосов
/ 16 января 2009

Сначала - я добавил к этому 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;
        }
    }
}
8 голосов
/ 16 января 2009

Почему вы не принимаете IDbConnection вместо строки соединения с вашим ctor?

2 голосов
/ 16 января 2009

Может быть ...

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 может быть даже лучше ...

1 голос
/ 16 января 2009

Если вы не хотите указывать SqlConnection там, где бы вы его указали - и как бы вы знали, чтобы использовать его, только если строка подключения содержит «MultipleActiveResultSets = true»?

Я подозреваю, что на каком-то уровне вам нужна фабрика соединений - либо Func<string, IDbConnection>, которую вы можете передать или установить где-либо, либо, возможно, просто класс:

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

Конечно, это всего лишь две стороны одной медали - ConnectionFactory - это просто статическая реализация Func<string, IDbConnection>.

0 голосов
/ 16 января 2009
  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;
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...