如何在.net核心中使用依赖注入处理带有dapper的postgresqldb连接



我在asp.net核心web API项目中使用Dapper ORM进行数据库操作。现在,我每次都打开新的数据库连接,并使用块在中使用它,这样当作用域结束时,它们就会被处理掉。但我希望在不使用使用块的情况下处理所有这些连接,并希望自动处理它们。我正在寻找一种使用依赖注入实现这一点的方法,因为它们自动处理实现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属性来创建数据库对象,并避免使用使用块来处理相同的对象。

我是这样做的:

在startup.cs文件中添加瞬态服务

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

在基本存储库构造函数中初始化IDbconnection对象,如:

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

并在我的存储库(如(中执行DB操作

class XyzRepository : RepositoryBase
{
public async Task<IEnumerable<T>> GetAllAsync()
{
IEnumerable<T> records = null;
await _connection.ExecuteScalarAsync<object>("sqlQuery");
return records;
}
}

这将在请求结束时自动处理IDbconnection对象,而不使用使用块。

答案参考:如何使用中的Dapper处理数据库连接。NET?

您不希望只使用一个数据库连接进行数据库访问。当数据库连接被处理(在using块的末尾(时,它会被返回到连接池,这比您自己想出的任何方案都要高效和安全得多。

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

这里有更多关于连接池的信息。

编辑:查看您的代码,我发现您已经将连接创建抽象掉了。你的代码实际上很好。

最新更新