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 を追加したいと考えています。問題は、イベント バブリングをトランザクションと統合することです。サービス層..次に、サービス層がこのイベントを処理し、クライアントにイベントを発行します..しかし、トランザクションがコミットされたことを確認する前に、これらのイベントを発行したくありません。BL レイヤーは私のビジネス トランザクション ロジックを認識していないため、CreatePerson メソッドでイベントを発生させます。
トランザクションを完了した後でのみ、サブスクライブしたイベントをスタック/処理するための設計ソリューションはありますか?

私の質問を簡単にするために: コミット後にのみ HandlePersonChanged を一括で実行したい..

4

2 に答える 2

0

トランザクション中に発生したすべてのイベントをさまざまなコンポーネントから格納するアクションキューを作成することになりました。
次に、ORMでトランザクションをコミットすると(OnCommitイベントがあります)、キューは保存されているすべてのイベントを1つずつ発生させます。もちろん、OnRollbackイベントが発生すると、アクションキューはクリアされて再起動されます。
この「アクションキュー」は、すべてのレイヤーで認識されているインフラストラクチャレイヤーにあります。

于 2013-01-07T09:13:29.400 に答える
0

コミット後のみHandlePersonChangedを一括で実行したい。

理論によると、データが変更されたので、イベントを発生させる必要があります。

2 番目の解決策:

いくつかのキュー構造を実装できます。トランザクションが完了するまでイベントを保存します。トランザクション完了イベントを介して、キューを処理します。

于 2012-11-27T11:01:45.187 に答える