То, как я делаю это в проекте ASP.NET Core (потерпите меня на секунду, я знаю, что это не то, что вы используете, но концепция все еще применима) вводит строку подключения через конструктор хранилища.
Как вы увидите, я фактически внедряю объект IConfiguration
, потому что мне нужны другие настройки из файла конфигурации из-за других требований. Просто представьте, что это строка подключения.
Тогда мой репозиторий выглядит следующим образом (грубый пример, записанный на макушке моей головы, так что простите мне любые ошибки, которые я мог совершить):
public class FooRepository
{
private readonly IConfiguration _configuration;
public FooRepository(IConfiguration configuration)
{
_configuration = configuration
}
private IDbConnection Connection => new SqlConnection(_configuration.GetConnectionString("myConnectionString"));
public Foo GetById(int id)
{
using (var connection = Connection)
{
return connection.QueryFirstOrDefault<Foo>("select * from ...", new {id});
}
}
}
Соединения ADO.NET объединяются, открывая их по мере необходимости, а затем закрывая, как обычно. С using
вы убедитесь, что соединения закрыты и удалены - возвращены в пул - как только вы закончите, даже если возникнет исключение.
Конечно, вы можете захотеть извлечь этот общий код в абстрактный суперкласс, чтобы вам не нужно было повторять имя строки подключения в каждом репозитории или повторно реализовывать свойство Connection
.
Кроме того, как я уже упоминал в своем комментарии, Даппер не отвечает за открытие или закрытие соединений, фактически он полностью ожидает открытия соединения до того, как вы сможете вызвать любой из его методов. Это больше не правда, извините .