Как обрабатывать соединения postgresql db с dapper с использованием инъекции зависимостей в ядре .NET?

Я использую Dapper ORM для операций с базой данных в моем основном проекте веб-API asp.net. Прямо сейчас я открываю новое соединение с базой данных каждый раз и использую его внутри блока using, чтобы они были удалены, когда область действия закончится. Но я хотел обрабатывать все эти соединения без использования блока using, а также хотел избавиться от них автоматически. Я искал способ добиться этого, используя внедрение зависимостей, поскольку они автоматически удаляют объекты, реализующие IDisposable.

Вот как я обрабатываю все подключения к БД:

Создал свойство GetConnection в моем базовом репозитории:

private IDbConnection _connection;

public IDbConnection GetConnection
{
    get
    {
        _connection = new NpgsqlConnection("Connection String");
        return _connection;
    }
}

Доступ к свойству внутри с помощью блока:

public async Task<IEnumerable<T>> GetAllAsync()
{
    IEnumerable<T> records = null;

    using (IDbConnection connection = GetConnection)
    {
        //db operations
    }

    return records;
}

Итак, как я могу добиться того же, используя внедрение зависимостей, которое будет инициализировать IDbconnection, когда это необходимо, и избавиться от него в конце запроса без необходимости инкапсулировать IDbconnection внутри блока using?

Короче говоря, я хочу избежать использования свойства GetConnection каждый раз для создания объекта базы данных и исключить использование блоков using для его удаления.


person Sunny12    schedule 19.11.2019    source источник
comment
Почему вы хотите удалить using блоков? Предлагаемые передовые методы на самом деле основаны на мнении, но вы можете взглянуть на это. Я думаю, вы ищете шаблон UoW-Per-Request. Решение, указанное в ссылке, поможет вам в этом.   -  person Amit Joshi    schedule 19.11.2019
comment
Потому что я хочу избавиться от каждого подключения к базе данных с помощью внедрения зависимостей и не хочу использовать блоки в приложении.   -  person Sunny12    schedule 19.11.2019
comment
как описано здесь: stackoverflow.com/a/47403685/11748401 .. Я просто хотел знать, какие будут лучшие практики, будет ли хорошо обрабатывать операции с базой данных, как описано в этой ссылке, или нет?   -  person Sunny12    schedule 19.11.2019
comment
Я не хочу включать блоки using везде в своем приложении, где я выполняю операции с БД. Они должны автоматически удаляться в конце запроса.   -  person Sunny12    schedule 19.11.2019
comment
Короче говоря, просто хотел спросить, представлен ли здесь ответ: stackoverflow.com/a/47403685/11748401 рекомендуется для обработки подключений к БД в dapper или нет. Кроме того, я получил вашу точку зрения, чтобы ввести UoW в файл startup.cs, чтобы избежать использования блока. Но если мы введем IDbconnection в файл startup.cs, он также удалит объект БД, поскольку IDbconnection также реализует IDisposable, и нам не нужно писать dispose () в UoW, и вызов dispose () не потребуется, поскольку все, что будет обрабатываться IDbconnection автоматически. Какой бы ни была операция, она будет удалена автоматически,   -  person Sunny12    schedule 19.11.2019


Ответы (2)


У меня так получилось:

Добавление временной службы в файл startup.cs

services.AddTransient<IDbConnection>((sp) => new NpgsqlConnection("connectionString"));

Инициализация объекта IDbconnection в конструкторе базового репозитория, например:

class  RepositoryBase
{
    protected IDbConnection _connection;

    protected RepositoryBase(IDbConnection dbConnection)
    {
         _connection = dbConnection;
    }
}

и выполнение операции БД в моих репозиториях, например

class XyzRepository : RepositoryBase
{
    public async Task<IEnumerable<T>> GetAllAsync()
    {
        IEnumerable<T> records = null;

        await _connection.ExecuteScalarAsync<object>("sqlQuery");

        return records;
    }

}

Это автоматически удалит объект IDbconnection в конце запроса без использования блоков using.

Ссылка из ответа: Как мне справиться Подключение к базе данных с Dapper в .NET?

person Sunny12    schedule 20.11.2019

Вы не хотите использовать только одно соединение с базой данных для доступа к базе данных. Когда соединение с базой данных удаляется (в конце блока using), оно возвращается в пул соединений, что намного эффективнее и безопаснее, чем любая схема, которую вы можете придумать самостоятельно.

Если вы хотите удалить зависимость от NpgsqlConnection, вы должны создать фабрику соединений, которая создает IDbConnection, и вставить фабрику в ваши классы. Конструкция using - это хорошая практика, от которой не стоит отказываться.

Подробнее о пуле подключений здесь.

Изменить: глядя на ваш код, я вижу, что вы уже абстрагировали создание соединения. Ваш код и так хорош.

person Palle Due    schedule 19.11.2019
comment
Я согласен с тем, что использование блока удаляет объект и возвращает пулу соединений, и это то, что делает инъекция зависимостей в ядре .net. Если я ввожу IDbConnection как временную службу, он автоматически удалит объект базы данных, и я не буду писать блок using для любой операции с БД. - person Sunny12; 19.11.2019
comment
как описано здесь: stackoverflow.com/a/47403685/11748401 .. Я просто хотел знать, какие будут лучшие практики, будет ли хорошо обрабатывать операции с базой данных, как описано в этой ссылке или нет? - person Sunny12; 19.11.2019
comment
Я не вижу, чтобы соединения удалялись и повторно использовались в ответе, на который вы ссылаетесь. Соединение сохраняется в течение всего срока службы репозитория. - person Palle Due; 19.11.2019
comment
Соединение будет удалено в конце запроса, поскольку IDbconnection вводится с использованием службы Transient, например services.AddTransient ‹IDbConnection› ((sp) = ›new SqlConnection (dbConnectionString)); - person Sunny12; 19.11.2019
comment
Хорошо, спасибо, что заставили меня прочитать AddTransient. Я по-прежнему считаю плохой практикой поддерживать соединение на протяжении всего запроса. Соединения следует утилизировать как можно скорее. - person Palle Due; 19.11.2019
comment
Думаю, это также может быть полезно, поскольку все операции с БД будут выполняться только с использованием этого объекта. Просто поделившись своими мыслями, не уверен, будет ли это полезно при любых условиях или нет. - person Sunny12; 19.11.2019
comment
В этой статье рассказывается о различных методах удаления объекта: andrewlock.net/. - person Sunny12; 19.11.2019