我有一个带有一堆事件的自动状态机。我想在前一个事件完成后发布每个事件。我知道我可以在每个事件的消费者中发布它,但其中一些可能会在不同的状态机中重用,所以我想在状态机定义中声明它。这是我现在拥有的:
public class TestStateMachine : MassTransitStateMachine<TestState>
{
public State StepOneCompleted { get; set; }
public State StepTwoCompleted { get; set; }
public State StepThreeCompleted { get; set; }
public Event<ProcessStepOne> ProcessStepOne { get; set; }
public Event<ProcessStepTwo> ProcessStepTwo { get; set; }
public Event<ProcessStepThree> ProcessStepThree { get; set; }
public TestStateMachine()
{
InstanceState(x => x.CurrentState);
Initially(When(ProcessStepOne)
.Publish(context => new ProcessStepTwo
{
CorrelationId = context.Data.CorrelationId,
})
.TransitionTo(StepOneCompleted));
During(StepOneCompleted,
When(ProcessStepTwo)
.Publish(context => new ProcessStepThree
{
CorrelationId = context.Data.CorrelationId,
})
.TransitionTo(StepTwoCompleted));
During(StepTwoCompleted, When(ProcessStepThree).TransitionTo(StepThreeCompleted));
}
}
有了这个定义,第二步在第一步仍在执行时发布,第三步在第二步正在执行时发布。我想确保第一步完成,然后第二步发布,然后第二步完成,第三步发布。我尝试使用WhenLeave
行为,但它需要一个状态,而不是一个事件,所以我无权访问,context.Data
并且 CorrelationId 将不仅仅是我将在步骤之间传递的变量。
有没有办法在状态机定义中实现这一点?