2012-11-27 43 views
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只有在提交後..

+0

您可以使用新方法在業務層內移動事務,並創建另一個事件,如'BatchOfPersonChanged'而不是'PersonChanged'。 –

回答

0

我已經結束了構建一個Action Queue,它存儲了事務期間從不同組件發起的所有事件。
然後,在ORM中提交事務(我有一個OnCommit事件)時,隊列逐個觸發所有存儲的事件。當然,如果OnRollback事件被觸發,Action隊列將被清除並重新啓動。
這個「操作隊列」位於所有層中已知的基礎架構層。

0

我想在批量執行HandlePersonChanged只有在提交後。

根據理論,事件應該被觸發,因爲數據被改變。

第二種解決方案:

你可以實現一些隊列結構。保存事件直到完成事務。並通過事務完成事件處理隊列。