我已经使用 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 失败的情况:
- 当我首先发送客户端图片消息时,它会创建一个新的传奇并存储它。
- 然后我发送一条客户端更改消息,它创建另一个 saga 并将其存储,即找不到客户端图片消息创建的 saga
- 然后我发送客户联系人更改消息,它以某种方式找到了由客户图片更改创建的传奇,但现在找不到工作人员。
我无法弄清楚为什么会这样。
saga 成功的情况:
- 当我首先发送客户端更改消息时,它会创建传奇。
- 然后我发送客户端联系人更改消息,它找到了传奇并执行得很好。
谁能解释为什么会发生这种行为。
如果需要更多信息,请告诉我。
谢谢
更新
再次检查我的代码时,我发现了这个问题的原因。我的 ClientChangeMessage 也继承自 IContainSaga 数据(我正在尝试但忘记删除的东西)。删除继承链接后,一切正常。(羞愧地低着头)