Nservicebus N服务总线saga订购

Nservicebus N服务总线saga订购,nservicebus,saga,Nservicebus,Saga,我有两个传奇故事,即客户传奇和客户账单传奇 public class ClientSagaState:IContainSagaData { #region NserviceBus public Guid Id { get; set; } public string Originator { get; set; } public string OriginalMessageId { get; set; } #

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

 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
          }


    }
public类ClientSagaState:IContainSagaData
{
#区域服务总线
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
#端区
公共Guid ClientRef{get;set;}
公共ClientMessage ClientChangeMessage{get;set;}
公共ClientContactChangeMessage ClientContactChange{get;set;}
}
公共类ClientBillingSagaState:IContainSagaData
{
#区域服务总线
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
#端区
公共Guid ClientRef{get;set;}
公共Guid FunderRef{get;set;}
公共Guid ClientBillingRef{get;set;}
公共ClientBillingMessage ClientBillingMessage{get;set;}
}
公共类客户传奇:传奇,
我开始发短信,
我开始发短信了
{
公共覆盖无效配置HowtoFindsaga()
{
配置映射(s=>s.ClientRef,m=>m.EntityRef);
配置映射(s=>s.ClientRef,m=>m.PrimaryEntityRef);
}
公共无效句柄(ServiceUserChangeMessage消息)
{
if(BusRefTranslator.GetLocalRef(EntityTranslationNames.ClientChange,message.EntityRef.Value)!=null)
{
GetHandler().Handle(消息);
CompleteTheSaga();
返回;
}
HandleServiceUserChangeAndDependencies(消息);
//MarkAsComplete();
CompleteTheSaga();
}
}
公共类客户端比林萨加:传奇
,i handlemessages,
我开始发短信,
IHandleMessages
{
公共覆盖无效配置HowtoFindsaga()
{
配置映射(s=>s.ClientRef,m=>m.EntityRef);
配置映射(s=>s.FunderRef,m=>m.EntityRef);
配置映射(s=>s.ClientBillingRef,m=>m.PrimaryEntityRef);
}
公共无效句柄(ClientChangeMessage消息)
{
var state=这个.Data;
if(state.ClientBillingMessage!=null)
{
句柄(state.ClientBillingMessage);
}
}
公共无效句柄(CareSysInvoiceLineInsertMessage消息)
{
//首先检查出资人
//如果出资人不在,则将信息存储在传奇中
//如果出资人在场,则检查客户
//如果客户机不在,则将消息放在saga中
//如果出资人和客户在场,则执行消息删除传奇
}
}
以下是场景:

1) 如果我收到一条ClientBillingMessage,其客户和出资人不在那里,我会将该消息存储在saga中

2) 如果现在有了资助者的消息,那么它就会被执行,但这个传奇故事仍然在等待客户的消息

3) 现在,如果客户机消息出现,它将首先运行ClientBillingSaga的客户机消息处理程序,因此已经存在的ClientBillingSaga仍然存在,然后它将在ClientSaga for client消息中执行处理程序


我的问题:我有没有办法下令执行这两个传奇故事。我发现了一个处理消息处理的ISpecifyMessageHandlerOrdering接口,但我认为我不能将它用于saga。

saga旨在帮助随着时间的推移同步事件

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

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


希望这能有所帮助

我认为你不应该下令执行两个传奇。Saga应该是完全自主的,只对接收到的消息进行操作,具有内部状态,或者发送消息,或者完成。如果你真的想与另一个传奇人物互动,你应该使用消息(命令/事件)