Куди покласти загальне підключення до бази даних для моїх класів


11

У мене є кілька класів (Репозиторії), які виконують завдання збереження / отримання деяких об'єктів у / з бази даних; всі вони повинні встановити з'єднання з однією базою даних.

Я думав, щоб уникнути переосмислення ConnectionStringтаSqlConnection в кожному класі, передаючи відкрите з'єднання з ними. Тоді де / коли найкраще місце / час визначити / відкрити це з'єднання та передати його класам?

Чи є кращі підходи / структури доступу до цього загального ресурсу?

Відповіді:


10

Передача відкритого зв'язку до кожного класу, мабуть, не найкраща ідея. Ознайомтесь зі створенням з'єднань із базою даних - чи роблять це один раз або для кожного запиту?

Він рекомендує відкривати та закривати з'єднання для кожного запиту, який ви хочете запустити, а не передавати відкрите з'єднання у ваше сховище.

Ви можете спробувати щось подібне, щоб допомогти вам у керуванні своїми зв’язками.

public class Repository
{
    private readonly string _connectionString;

    public Repository()
    {
        _connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
    }

    protected SqlConnection GetConnection()
    {
         return new SqlConnection(_connectionString);
    }


}

public sealed class UserRespository : Repository
{

    public User GetUsers()
    {
        using (var connection = GetConnection())
        {
            using (var commnad = new SqlCommand("SqlQuery", connection))
            {
                //Execute Query
                //Return results
            }
        }
    }
}

5

Мати відкрите з'єднання та передавати його між класами, як правило, погана ідея. Звичайно, відкриття з'єднання - це досить вдалий показник, але це вже переймається пулом з'єднань, використовуючи повторно відкриті з'єднання. Хоча зауваження: завжди чекайте як можна довше дзвінка connection.Open(), особливо в багатопотоковому коді, оскільки це призначить з'єднання з вашим методом (що потенційно збільшить необхідну кількість відкритих підключень до бази даних).

Щоб зробити ваші класи максимально універсальними, я рекомендую мати базовий клас, що відкриває метод із IDbConnection, і ваші сховища матимуть більш загальну реалізацію.

internal abstract class Repository
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;

    protected IDbConnection GetConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

public class MyRepository : Repository
{
    public IEnumerable<object> Get()
    {
        using (var connection = GetConnection())
        {
            connection.Open();

            ...
        }
    } 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.