Nservicebus传奇订购

时间:2013-09-04 13:13:07

标签: nservicebus saga

我有两个传奇,即客户传奇和客户账单传奇。

 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 for Client消息中的处理程序。

我的问题:有什么方法可以命令执行这两个传奇。我找到了ISpecifyMessageHandlerOrdering接口来处理消息,但我认为我不能将它用于传奇。

2 个答案:

答案 0 :(得分:0)

Sagas旨在帮助同步事件。

您可以从您在saga状态下处理的消息中收集所需的数据,一旦处理完所有数据,然后继续发送命令/发布事件,以便处理程序可以处理业务逻辑。

注意:实际工作(业务逻辑和域数据操作)应在单独的处理程序中完成(以符合SRP和工作单元)。

希望这会有所帮助

答案 1 :(得分:0)

我认为你不应该订购两个Sagas的执行。 Saga应该纯粹根据它收到的消息自主行动,具有内部状态并发送消息或完成消息。如果你真的想与另一个Saga交互,你应该使用消息(命令/事件)。