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应该是完全自主的,只对接收到的消息进行操作,具有内部状态,或者发送消息,或者完成。如果你真的想与另一个传奇人物互动,你应该使用消息(命令/事件)