如何在 .net 核心中使用依赖注入处理与 dapper 的 postgresql 数据库连接?

How to handle postgresql db connections with dapper using dependency injection in .net core?

我在 asp.net 核心网络 API 项目中使用 Dapper ORM 进行数据库操作。现在我每次都打开新的数据库连接并在 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 块来处理相同的对象。

您不想只使用一个数据库连接来访问数据库。当一个数据库连接被释放时(在 using 块的末尾)它被返回到连接池,这比你自己想出的任何方案都更有效和安全。

如果您想删除对 NpgsqlConnection 的依赖,您应该创建一个连接工厂来创建 IDbConnection 并将该工厂插入到您的 类 中。 using 构造是很好的最佳实践,而不是您想要摆脱的东西。

关于连接池的更多信息here

编辑:查看您的代码,我发现您已经将连接创建抽象化了。您的代码实际上没有问题。

我是这样做的:

在 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 块。

参考答案:How do I handle Database Connections with Dapper in .NET?