c# – Dispose()如何知道它是因为异常而调用的?
发布时间:2020-12-15 08:04:52 所属栏目:百科 来源:网络整理
导读:我想编写一个简单的工作类单元,其行为如下: using (var unitOfWork = new UnitOfWork()){ // Call the data access module and don't worry about transactions. // Let the Unit of Work open a session,begin a transaction and then commit it.} 这就是
我想编写一个简单的工作类单元,其行为如下:
using (var unitOfWork = new UnitOfWork()) { // Call the data access module and don't worry about transactions. // Let the Unit of Work open a session,begin a transaction and then commit it. } 这就是我到目前为止(如果您认为我的设计错误,欢迎任何评论): class UnitOfWork : IDisposable { ISession _session; ITransation _transaction; . . . void Dispose() { _transaction.Commit(); _session.Dispose(); } } 我想要做的是回滚事务,以防数据访问代码抛出一些异常.所以Dispose()方法看起来像: void Dispose() { if (Dispose was called because an exception was thrown) { _transaction.Commit(); } else { _transaction.RollBack(); } _session.Dispose(); } 是否有意义?如果是这样,怎么办呢? 解决方法
“Dispose()”应该与事务提交或回滚无关.您应该在Dispose()方法中处理事务.更改Dispose()方法的语义只会为您和使用您的类的其他任何人带来混乱.
事务的Commit()和RollBack()方法与Dispose()方法没有任何关系,因为这两个方法和Dispose()之间没有关联,因为无论最终结果如何,都必须处理事务. 这是关于连接和事务使用的正确模式.注意Roolback(0与异常有关(而不是处置) connection.Open(); var trasnaction = null; try { transaction = connection.BeginTransaction(); ///Do Some work transaction.Commit(); } catch { transaction.Rollback(); } finally { if (transaction != null) transaction.Dispose(); connection.Close(); } 因此,使用Commit(),Roolback()和Dispose()方法在UnitOfWork中模仿这种模式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |