Как я могу поделиться IDisposable ресурсами в классе? - PullRequest
1 голос
/ 06 мая 2009

Я пишу некоторые консольные приложения для перемещения данных между базами данных SQLite. Классы для соединения и различные подготовленные операторы имеют важное значение IDisposable, поэтому я создаю экземпляры этих объектов, используя блоки using, например:

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
{
    sqlite_conn.Open();
    using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
    {
        sqlite_cmd.Connection = sqlite_conn;
        sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
        sqlite_cmd.ExecuteNonQuery();
    }
    sqlite_conn.Close();
}     

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

Я понимаю, что это вопрос новичка в C #, поэтому, пожалуйста, адаптируйте свои ответы как таковые. Если у вас есть предложенное решение, я хотел бы, чтобы вы включили пример кода для иллюстрации.

РЕДАКТИРОВАТЬ: Мой случай использования - консольное приложение. Кто-то передает строки подключения источника и назначения, и консольное приложение выполняет операцию. Могу ли я на самом деле заставить мой консольный класс Program реализовывать IDisposable следующим образом?

class Program : IDisposable
{
    private SQLiteConnection sourceConnection;
    private SQLiteConnection destinationConnection;

    public void Dispose()
    {
        sourceConnection.Dispose();
        destinationConnection.Dispose();
    }  
}

Ответы [ 3 ]

2 голосов
/ 06 мая 2009

Мне нужно иметь возможность создавать эти соединения в одном методе, а затем вызывать их в других методах. Каков самый чистый и наименее запутанный способ хранения этих соединений в качестве переменных экземпляра?

В этом случае класс, в котором вы храните эти переменные экземпляра, должен сам реализовать IDisposable, а при утилизации должен убедиться, что соединения также расположены.

Кроме того, если у вас есть несколько IDisposables одновременно, вы можете переписать их таким образом, сгруппировать их и уменьшить вложенность в коде:

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
{
    sqlite_conn.Open();

    sqlite_cmd.Connection = sqlite_conn;
    sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
    sqlite_cmd.ExecuteNonQuery();
} // no need to call .Close(): IDisposable normally handles it for you
1 голос
/ 06 мая 2009

Один из способов - это реализовать в вашем классе IDisposable. В методе Dispose вашего класса вызовите методы Dispose для соединения, команды и т. Д. Затем вы можете использовать экземпляр вашего класса в блоке using.

1 голос
/ 06 мая 2009

Вы можете сделать свой класс реализующим IDisposable и убедиться, что вы очищаете соединение и т. Д. В вашем методе Dispose. Тогда метод, вызывающий ваш класс, может использовать (MyClass c ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...