【发布时间】:2019-11-19 08:26:02
【问题描述】:
我在我的 asp.net 核心 Web 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块?建议最佳实践实际上是基于意见的,但您可以查看this。我猜您正在寻找 UoW-Per-Request 模式。链接中给出的解决方案可以帮助您实现这一目标。 -
因为我想使用依赖注入来处理每个数据库连接,并且想避免在应用程序中使用块。
-
就像这里描述的:stackoverflow.com/a/47403685/11748401 ..我只是想知道什么是最佳实践,处理这个链接中描述的数据库操作是否会很好?
-
我不想在我正在执行数据库操作的应用程序中的任何地方都包含使用块。它们应该在请求结束时自动处理。
-
简而言之,只是想问一下这里提供的答案:stackoverflow.com/a/47403685/11748401 是否推荐用于处理 Dapper 中的 DB 连接。另外,我明白你的意思是在 startup.cs 文件中注入 UoW 以避免使用块。但是,如果我们在 startup.cs 文件中注入 IDbconnection,它也会处理 DB 对象,因为 IDbconnection 也实现了 IDisposable,我们不需要在 UoW 中编写 dispose(),也不需要调用 dispose(),因为所有这些都将由IDb 自动连接。不管是什么操作,都会自动处理,
标签: asp.net-core dapper npgsql asp.net-core-3.0