Как 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();
   }

Есть ли в этом смысл? И если да, то как это можно сделать?

8
задан Ilya Kogan 10 March 2011 в 06:23
поделиться