internal class ExampleSaga : AutomatonymousStateMachine<ExampleSagaState>
{
public Event<StartMsg> StartMsg{ get; private set; }
public Event<FirstMsgCalculated> FirstMsgCalculated{ get; private set; }
public Event<SecondMsgCalculated> SecondMsgCalculated{ get; private set; }
public Event<ThirdMsgCalculated> ThirdMsgCalculated{ get; private set; }
public Event AllMessagesRecieved { get; private set; }
public State WaitingForData { get; private set; }
public ExampleSaga()
{
InstanceState(c => c.CurrentState);
InitStates();
InitEvents();
Initially(
When(StartMsg)
.Then((state, command) =>
{
state.CalculationId = command.CalculationId;
})
.Publish((state) => new CalculateFirstMsg(state.CalculationId))
.Publish((state) => new CalculateSecondMsg(state.CalculationId))
.Publish((state) => new CalculateThirdMsg(state.CalculationId))
.TransitionTo(WaitingForData));
During(WaitingForData,
When(FirstMsgCalculated)
.Then((state, data) =>
{
Console.WriteLine("first msg response received");
}),
When(SecondMsgCalculated)
.Then((state, data) =>
{
Console.WriteLine("second msg response received");
}),
When(ThirdMsgCalculated)
.Then((state, data) =>
{
Console.WriteLine("third msg response received");
}),
When(AllMessagesRecieved)
.Then((state) =>
{
Console.WriteLine("done");
})
.Publish((state) =>
{
return new CalculationEnded(state.CalculationId);
})
.Finalize());
}
public void ConfigureStateMachineCorrelations(StateMachineSagaRepositoryConfigurator<VirtualStocksReportSagaState> r)
{
r.Correlate(StartMsg, (state, message) => state.CalculationId == message.CalculationId)
.SelectCorrelationId(message => message.CalculationId);
r.Correlate(FirstMsgCalculated, (state, calculated) => state.CalculationId == calculated.CalculationId);
r.Correlate(SecondMsgCalculated, (state, calculated) => state.CalculationId == calculated.CalculationId);
r.Correlate(ThirdMsgCalculated, (state, calculated) => state.CalculationId == calculated.CalculationId);
}
private void InitStates()
{
State(() => WaitingForData);
}
private void InitEvents()
{
Event(() => StartMsg);
Event(() => FirstMsgCalculated);
Event(() => SecondMsgCalculated);
Event(() => ThirdMsgCalculated);
Event(() => DataRetrieved, x => x.CompositeStatus,
FirstMsgCalculated,
SecondMsgCalculated,
ThirdMsgCalculated);
}