c# – Dispose()如何知道它是因为异常而调用的?

我想编写一个简单的工作类单元,其行为如下:
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中模仿这种模式.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...