首页 > 解决方案 > 每个事件完成后如何在自动状态机中发布事件?

问题描述

我有一个带有一堆事件的自动状态机。我想在前一个事件完成后发布每个事件。我知道我可以在每个事件的消费者中发布它,但其中一些可能会在不同的状态机中重用,所以我想在状态机定义中声明它。这是我现在拥有的:

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 将不仅仅是我将在步骤之间传递的变量。

有没有办法在状态机定义中实现这一点?

标签: c#.netmasstransitautomatonymous

解决方案


推荐阅读