我有两个传奇,即客户传奇和客户账单传奇。
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接口来处理消息,但我认为我不能将它用于传奇。
答案 0 :(得分:0)
Sagas旨在帮助同步事件。
您可以从您在saga状态下处理的消息中收集所需的数据,一旦处理完所有数据,然后继续发送命令/发布事件,以便处理程序可以处理业务逻辑。
注意:实际工作(业务逻辑和域数据操作)应在单独的处理程序中完成(以符合SRP和工作单元)。
希望这会有所帮助
答案 1 :(得分:0)
我认为你不应该订购两个Sagas的执行。 Saga应该纯粹根据它收到的消息自主行动,具有内部状态并发送消息或完成消息。如果你真的想与另一个Saga交互,你应该使用消息(命令/事件)。