IDisposable模式

IDisposable模式不是经典的GOF模式之一,主要是实现IDisposable接口,这在.Net Framework中很常见,当用using语句时,实现这个接口的类在释放资源时自动释放。例如我们在开发中经常用到事务控制,这时我们写一个事务控制类,让它继承IDisposable接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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();
        }
    }
}
posted @   known  阅读(540)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示