0

这更像是一个概念问题。我正在使用 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 ..

4

2 回答 2

0

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

根据理论,应在数据更改后触发事件。

第二种解决方案:

你可以实现一些队列结构。保存事件直到完成交易。在事务完成事件上,处理队列。

于 2012-11-27T11:01:45.187 回答
0

我最终构建了一个动作队列,它存储了在事务期间从不同组件触发的所有事件。
然后,在 ORM 中提交事务时(我有一个 OnCommit 事件),队列将一一触发它存储的所有事件。当然,如果触发 OnRollback 事件,则清除并重新启动操作队列。
这个“动作队列”在所有层都知道的基础设施层中。

于 2013-01-07T09:13:29.400 回答