NserviceBus没有加载现有的传奇数据

时间:2013-08-21 15:22:40

标签: nservicebus saga

我使用nservice bus saga实现了我的连接器。以下是代码

    public class ClientSaga : Saga<ClientSagaState>, 
            IAmStartedByMessages<ClientChangeMessage>, 
            IAmStartedByMessages<ClientContactChangeMessage>,
            IAmStartedByMessages<ClientPictureChangeMessage>, 
            IHandleTimeout<ClientSagaState>
        {
            [SetterProperty]
            public IClientContactChangeDb ClientContactChangeDb{get;set;}

            [SetterProperty]
            public IBusRefTranslator BusRefTranslator{get;set;}



            public void Handle(ClientContactChangeMessage message)
            {
                var state=this.Data;
                //Some handling logic
                //Check if client is not in database then store the state
                state.ClientContactChange=message;
                state.ClientRef =message.ClientRef;
                //if client is in the data base then 
                MarkAsComplete();
            }

            public void Handle(ClientChangeMessage message)
            {
                 var state=this.data;
                //Update or create the client depending on the situation
                //check for dependencies
                if(state.ClientContactChange !=null)
                {
                     //Handle the contact change
                } 
                else
                 {
                   state.ClientChangeMessage=message;
                    state.ClientRef=message.ClientRef;
                   }
            }
              public void Handle(ClientPictureChangeMessage message)
            {
                     var state=this.Data;
                 //If the client is there then update the picture else store in saga
                   state.ClientPictureChangeMessage =message;
                    state.ClientRef=message.ClientRef;
                   }
            }

            public override void ConfigureHowToFindSaga()
            {
                ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.ClientRef);
                ConfigureMapping<ClientPictureChangeMessage>(s => s.ClientRef, m => m.ClientRef);
                ConfigureMapping<ClientChangeMessage>(s => s.ClienttnRef, m => m.Id);
            }
        }


        public class ClientSagaState: IContainSagaData
        {
            //i dont need these three fields
            public Guid Id { get; set; }
            public string Originator { get; set; }
            public string OriginalMessageId { get; set; }

           // the fields which i needed
           public Guid ClientRef {gee; set;}
           public ClientChangeMessage ClientChange {get;set;}
           public ClientContactChange ClientContactChange {get;set;}
           public ClientPictureChangeMessage  ClientPictureChangeMessage {get;set;}
        }

现在在我的连接器中,无法创建客户端联系人更改消息的客户端。

saga失败的情况:

  1. 当我首先发送客户端图片消息时,它会创建一个新消息 传奇和存储它。
  2. 然后我发送一个客户端更改消息,它创建另一个传奇和 存储它,即找不到客户端图片创建的传奇 消息
  3. 然后我发送客户联系人更改消息它以某种方式找到 由客户图片改变创建的传奇,但现在找不到工作人员。
  4. 我无法弄清楚为什么会这样。

    saga成功时的情况:

    1. 当我首先发送客户端更改消息时,它会创建传奇。
    2. 然后我发送客户端联系人更改消息,它找到了传奇 并且执行得很好。
    3. 任何人都可以解释为什么会发生这种情况。

      如果需要更多信息,请与我们联系。

      由于

      更新

      再次检查我的代码时,我找到了原因。我的ClientChangeMes​​sage也继承了IContainSaga数据(我尝试了但忘记删除的东西)。删除继承链接后一切正常。 (头上挂着羞耻)

1 个答案:

答案 0 :(得分:1)

在所有处理程序中,您需要在Saga数据上设置ClientRef。 所以,你会有:

  public void Handle(ClientContactChangeMessage message)
        {
            Data.ClientRef = message.ClientRef
            ...
        }

由于任何这些消息都可以启动saga,因此您需要在saga状态中设置此值。当其他消息进入时,它将由此id共同关联,因为已存在具有此Id的传奇实例。

要引用您的saga状态变量,请使用Data。这个内容。