如何在 .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?
我在 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?