IDisposable模式不是经典的GOF模式之一,主要是实现IDisposable接口,这在.Net Framework中很常见,当用using语句时,实现这个接口的类在释放资源时自动释放。例如我们在开发中经常用到事务控制,这时我们写一个事务控制类,让它继承IDisposable接口。
using System;
using System.Data;
public class TransactionControl : IDispoable
{
private bool _disposed = false;
private IDbConnection _conn;
private IDbTransaction _trans;
public TransactionControl()
{
try
{
_conn = ConnFactory.Create(ConnManager.GetConnInfo());
_conn.Open();
_trans = _conn.BeginTransaction();
}
catch
{
Dispose();
}
}
public TransactionControl(string name)
{
try
{
_conn = ConnFactory.Create(ConnManager.GetConnInfoByName(name));
_conn.Open();
_trans = _conn.BeginTransaction();
}
catch
{
Dispose();
}
}
public void Commit()
{
_trans.Commit();
}
public void Rollback()
{
_trans.Rollback();
}
public IDbConnection Connection
{
get { return _conn; }
}
public IDbTransaction Transaction
{
get { return _trans; }
}
~DisposeObject()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
CleanUp();
GC.SuppressFinalize(this);
}
_disposed = true;
}
}
private void CleanUp()
{
if (_trans != null)
{
_trans.Dispose();
}
if (_conn != null)
{
if (_conn.State != ConnectionState.Closed)
{
_conn.Close();
}
_conn.Dispose();
}
}
}
using System.Data;
public class TransactionControl : IDispoable
{
private bool _disposed = false;
private IDbConnection _conn;
private IDbTransaction _trans;
public TransactionControl()
{
try
{
_conn = ConnFactory.Create(ConnManager.GetConnInfo());
_conn.Open();
_trans = _conn.BeginTransaction();
}
catch
{
Dispose();
}
}
public TransactionControl(string name)
{
try
{
_conn = ConnFactory.Create(ConnManager.GetConnInfoByName(name));
_conn.Open();
_trans = _conn.BeginTransaction();
}
catch
{
Dispose();
}
}
public void Commit()
{
_trans.Commit();
}
public void Rollback()
{
_trans.Rollback();
}
public IDbConnection Connection
{
get { return _conn; }
}
public IDbTransaction Transaction
{
get { return _trans; }
}
~DisposeObject()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
CleanUp();
GC.SuppressFinalize(this);
}
_disposed = true;
}
}
private void CleanUp()
{
if (_trans != null)
{
_trans.Dispose();
}
if (_conn != null)
{
if (_conn.State != ConnectionState.Closed)
{
_conn.Close();
}
_conn.Dispose();
}
}
}