DisposableBase
这是一个抽象类,它实现了标准的 IDispose
接口模型,所有继承自它的子类,只需重写 Dispose(bool disposing) 方法完成资源的处理即可。
参数 disposing 你可以这样认为,通过 using 或显式调用 Dispose 方法时,disposing 的值为 true,而通过析构函数调用时,disposing 的值为 false。我们应尽量避免从析构函数里调用 Dispose 方法。
如以下的 Database
类就是继承自 DisposableBase
,在 Dispose 方法里处理数据库连接资源。
public class Database : DisposableBase
{
/// <summary>
/// 释放对象所占用的非托管和托管资源。
/// </summary>
/// <param name="disposing">为 true 则释放托管资源和非托管资源;为 false 则仅释放非托管资源。</param>
protected override bool Dispose(bool disposing)
{
if (_connMaster != null)
{
_connMaster.TryClose();
if (disposing)
{
_connMaster.Dispose();
_connMaster = null;
}
}
if (_connSlave != null)
{
_connSlave.TryClose();
if (disposing)
{
_connSlave.Dispose();
_connSlave = null;
}
}
return base.Dispose(disposing);
}
}
在重写 Dispose 方法时,还要注意内部变量调用 Dispose 方法,可能无法识别该方向是从何处进入,因此,应该使用扩展方法 TryDispose 传入 disposing 参数。TryDispose 方法请参阅 通用扩展 -- 尝试销毁对象资源。
public class DbContext : DisposableBase
{
/// <summary>
/// 释放对象所占用的非托管和托管资源。
/// </summary>
/// <param name="disposing">为 true 则释放托管资源和非托管资源;为 false 则仅释放非托管资源。</param>
protected override bool Dispose(bool disposing)
{
database.TryDispose(disposing);
return base.Dispose(disposing);
}
}