交易和事件在一起

时间:2012-11-27 10:48:31

标签: c# events

这更像是一个概念性问题。 我正在使用ORM编写基于事务的服务器 - 客户端应用程序。基本上,它意味着每个层都知道如何使用事务块,例如,这是一个Web服务层实现:

public HandleTransaction<TReturn>(Action<TReturn>)
{
    bool opendByMe = false;

    // Some static transaction manager
    var transactionMgr = GetTransactionManager();

    try
    {
       // If not opened before me
       if(!transactionMgr.IsActive)
       {
           transactionMgr.BeginTransaction();
           opendByMe = true;
       }    

       // Run the action
       var returnValue = action();

       // If we opened the transaction then we should close it
       if(opendByMe)
       {
           transactionMgr.Commit();
       }

       return returnValue;
    }

    catch
    {
       if(opendByMe)
       {
          if(transactionMgr.IsActive)
          {
              // Rollback only if i opened the transaction
              transactionMgr.Rollback();  
          }  
       }

       // Else, bubble exception
       throw;
    }
}

public void ServiceWork1()  
{  
    // Subscribe to person event
    PersonBL.PersonChanged += HandlePersonChanged(Person pers);

    HandleTransaction(() =>  
          {  
                // BL actions are made in a bulk.. If one of them fails the transaction  
                // should be rolled back  
                PersonBL.CreatePerson("Jeff");  
                PersonBL.CreatePerson("John");  
                PersonBL.CreatePerson("Peter");  
              };)  
    }   

public void HandlePersonChanged(Person pers)
{
    // Notify some one
}

这很好但现在我想在我的应用程序中添加一些事件 即PersonCreatedEvent ..问题是将事件冒泡与事务集成。在上面的示例中,假设PersonBL.CreatePerson()方法向服务层触发“PersonChanged”事件。然后服务层处理此事件并触发一个事件给客户..但我不想在确定事务已提交之前触发这些事件。 BL层不知道我的业务事务逻辑,因此它在CreatePerson方法中触发事件。
是否有任何设计解决方案用于在我完成交易后堆叠/处理我订阅的事件?

简化我的问题:我想在提交后在批量中执行HandlePersonChanged ..

2 个答案:

答案 0 :(得分:0)

  

我想在提交后在批量中执行HandlePersonChanged。

根据理论,应该在数据发生变化时触发事件。

第二个解决方案:

你可以实现一些队列结构。保存事件直到完成事务。并且在事务完成事件之后,处理队列。

答案 1 :(得分:0)

我最终构建了一个Action Queue,它存储了来自不同组件的事务期间触发的所有事件  然后,在ORM中提交事务(我有一个OnCommit事件)后,队列逐个触发所有存储的事件。当然,如果触发了OnRollback事件,则清除并重新启动Action队列。 此“操作队列”位于基础结构层中,该层在所有层中都是已知的。