【发布时间】:2019-10-10 22:52:52
【问题描述】:
我使用常规的Sql* 对象来查询我的数据库:
// conn is a SqlConnection
// transaction is a SqlTransaction
using(var cmd = new SqlCommand(someSelectQuery, conn, transaction))
using(var reader = cmd.ExecuteReader())
{
...
}
我要编写一个包装器,它将new SqlCommand() 和cmd.ExecuteReader() 打包在一起:
using(var someNewReader = GetSelectReader(someSelectQuery, conn, transaction))
{
...
}
问题是:这个“someNewReader”对象(或结构?)应该:
- 不知何故发布了与
SqlDataReader相同的方法 - 有一个
.Dispose()方法,它处理底层SqlCommand和SqlDataReader
我尝试了什么
我尝试创建一个包装类,它包含两个字段,一个SqlCommand 和一个SqlDataReader,以及:
- 公开
SqlDataReader的方法 - 重新实现了一个
.Dispose()方法,该方法处理两个对象(以正确的顺序)
以正确的方式重新实现.Dispose()(尤其是:以正确的方式处理异常,并且仍然尝试对每个人进行.Dispose())增加了容易出错的编码开销,但仍会遵循精确的 smae 结构每个.Dispose() 链。
问题
我想知道是否有一种机制可以将几个 IDisposable 对象“链接在一起”,这可以让我描述一下:
- 输入:
obj是Disposable - 输入:
parent是Disposable - 输出仍然有一个
obj(至少具有相同的公共接口),但正确调用obj.Dispose(),后跟parent.Dispose()处理
【问题讨论】:
-
Re-implementing .Dispose() in a correct maner adds a coding overhead which is error prone- 当您告诉 VS 在您的对象上实现IDisposable时,只需让 VS 为您生成样板,然后填写空白。仔细检查您对stackoverflow.com/a/898867/11683 的选择。在你的情况下,如果你的类是密封的,它是第一个选项,如果不是,第二个没有终结器。 -
作为旁注,有些事情不需要您处理它们,就好像它们被传递到一个对象中一样,该对象负责处理它们。这通常在传递流等时发生
-
我将创建两个方法并将执行阅读器调用推送到另一个(处理命令和连接)作为委托。它为您提供了您想要的方法,但不会“链接 IDisposable”。
标签: c# idisposable