【问题标题】:.net: Should our custom Data Access Layer classes implement Idisposable?.net:我们的自定义数据访问层类是否应该实现 Idisposable?
【发布时间】:2023-03-20 09:22:02
【问题描述】:

.net:我们的自定义数据访问层类是否应该实现 Idisposable?他们主要使用数据库作为数据存储来存储/检索数据?

谢谢

【问题讨论】:

  • 他们是否封装并因此需要处置本身实现IDisposable的对象?如果是,那么是的。否则,不。

标签: .net data-access-layer idisposable


【解决方案1】:

Dispose 主要用于释放非托管资源。例如套接字、与数据库的连接和文件句柄。

如果您自己不跟踪任何非托管资源,则您不需要不需要实现IDisposable,因为当 GC 收集 DbConnection 时,所有资源都会被释放。

我建议你做两件事:

a) 如果您有一个 DbConnection 作为成员变量,请实现 IDisposable 并在 Dispose 方法中释放连接。这仅在您使用 DAL 时使用 using 关键字时才有效。

b) 在任何可能的地方开始使用using,以确保尽快释放资源。

【讨论】:

  • 假设任何类型的 IDisposable 对象都将被 GC 安全且充分地清理是很危险的,除非您有明确的文档承诺。对于订阅长寿命对象的事件以在被放弃时自行清理的类,它通常必须通过两个额外的间接层路由所有事件,或者通过至少一个间接层路由所有非事件操作。虽然一些订阅事件的数据库包装器可能会这样做,但我不会依赖所有这些包装器。
  • 实际上,您所说的事件不仅针对 IDisposable,还针对所有将被垃圾收集的对象。 OP 没有询问不调用 Dispose 是否安全,而是询问他是否需要实现 IDisposable。
猜你喜欢
  • 1970-01-01
  • 2012-07-01
  • 2011-06-03
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多