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);
    }
}