0

クライアント サガとクライアント請求サガという 2 つのサガがあります。

 public class ClientSagaState:IContainSagaData
    {
        #region NserviceBus
        public Guid Id { get; set; }
        public string Originator { get; set; }
        public string OriginalMessageId { get; set; }
        #endregion

        public Guid ClientRef { get; set; }

        public ClientMessage ClientChangeMessage { get; set; }

        public ClientContactChangeMessage ClientContactChange { get; set; }


    }

      public class ClientBillingSagaState:IContainSagaData
    {
        #region NserviceBus
        public Guid Id { get; set; }
        public string Originator { get; set; }
        public string OriginalMessageId { get; set; }
        #endregion

        public Guid ClientRef { get; set; }

        public Guid FunderRef { get; set; }

        public Guid ClientBillingRef { get; set; }

        public ClientBillingMessage ClientBillingMessage { get; set; }


    }

     public  class ClientSaga:Saga<ClientSagaState>,
     IAmStartedByMessages<ClientChangeMessage>,
       IAmStartedByMessages<ClientContactChangeMessage>
   {

    public override void ConfigureHowToFindSaga()
       {

           ConfigureMapping<ClientChangeMessage>(s => s.ClientRef, m => m.EntityRef);
           ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.PrimaryEntityRef);
       }

    public void Handle(ServiceUserChangeMessage message)
       {

           if (BusRefTranslator.GetLocalRef(EntityTranslationNames.ClientChange, message.EntityRef.Value) != null)
           {

               GetHandler<ClientChangeMessage>().Handle(message);
               CompleteTheSaga();
               return;
           }
           HandleServiceUserChangeAndDependencies(message);
           //MarkAsComplete();
           CompleteTheSaga();
       }

   }

    public class ClientBillingSaga:Saga<ClientBillingSagaState>
        ,IHandleMessages<ClientChangeMessage>,
        IAmStartedByMessages<ClientBillingMessage>,
        IHandleMessages<FunderChangeMessage>
    {

        public override void ConfigureHowToFindSaga()
        {

            ConfigureMapping<ClientChangeMessage>(s => s.ClientRef, m => m.EntityRef);
            ConfigureMapping<FunderChangeMessage>(s => s.FunderRef, m => m.EntityRef);
            ConfigureMapping<ClientBillingMessage>(s => s.ClientBillingRef, m => m.PrimaryEntityRef);

        }

         public void Handle(ClientChangeMessage message)
        {
            var state = this.Data;
            if (state.ClientBillingMessage != null)
            {
                Handle(state.ClientBillingMessage);
            }
        }

          public void Handle(CareSysInvoiceLineInsertMessage message)
          {

                //First check for the funder 
                //If funder is not there store the message in saga

                //If funder is there then check for client
                //If client is not there then put the message in saga

                // if funder and client are there then execute the message delete the saga
          }


    }

シナリオは次のとおりです。

1) クライアントと資金提供者が存在しない ClientBillingMessage を受信した場合、このメッセージを saga に保存します。

2) 資金提供者のメッセージが届いた場合は実行されますが、クライアントのメッセージを待っているため、サガは存続します。

3) クライアント メッセージが来ると、最初に ClientBillingSaga のクライアント メッセージ ハンドラが実行されるため、既存の ClientBillingSaga は存続し、その後、クライアント メッセージの ClientSaga 内でハンドラを実行します。

私の質問: この 2 つの物語の実行を命じる方法はありますか? メッセージの処理を処理する ISpecifyMessageHandlerOrdering インターフェースを見つけましたが、サガには使用できないと思います。

4

2 に答える 2

0

二つの英雄譚の処刑を命じるべきではないと思います。Saga は、受信したメッセージだけに基づいて自律的に動作する必要があり、内部状態を持ち、メッセージを送信するか完了する必要があります。本当に別の佐賀とやり取りしたい場合は、メッセージ (コマンド/イベント) を使用する必要があります。

于 2013-09-26T14:39:07.877 に答える