我在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
结构是很好的最佳实践,而不是你想要摆脱的东西
这里有更多关于连接池的信息。
编辑:查看您的代码,我发现您已经将连接创建抽象掉了。你的代码实际上很好。