MassTransit Saga State to Instance State Mapping

时间:2017-04-05 02:40:45

标签: c# masstransit automatonymous

我是MassTransit的新手,我似乎无法弄清楚它是如何将我在saga(MassTransitStateMachine)上定义的状态映射到相关SagaStateMachineInstance类的“State”属性。

例如,如果我有一个具有三种状态的状态机类:

public class MySaga :
   MassTransitStateMachine<MySagaState>
{
    public State Executing { get; private set; }
    public State Completed { get; private set; }
    public State Failed { get; private set; }
    ...
}

我的状态机实例类有一个“State”属性

public class MySagaState : SagaStateMachineInstance
{
    public Guid CorrelationId { get; set; }
    public int State { get; set; }
}

MT如何判断哪个saga状态是哪个整数?

似乎还有两个内置的传奇状态,“初始”和“最终”,因此这个例子将有5个状态。状态如何完成整数映射?

2 个答案:

答案 0 :(得分:3)

State属性表示当前的状态机状态。只要状态机进入另一个状态,它就会改变。

它可以是复杂类型State或原始类型stringint。第一种情况,如果使用数据库持久性,Name对象的State属性将存储在数据库中。如果使用string(所有MassTransit示例都建议这样做) - 很明显该属性将包含状态名称,表示状态机属性名称。如果你使用int - 通过查看值是最难理解的,因为它已经达到惯例,如零是没有状态,一个是初始状态,2是最终状态,3个以后代表所有其他状态

我真的建议使用string,因为它更易于映射而且没有混淆。

所以你的传奇状态看起来像:

public class MySagaState : SagaStateMachineInstance
{
    public Guid CorrelationId { get; set; }
    public string CurrentState { get; set; }
}

您还应该在状态机构造函数中配置状态机状态对象的state属性:

InstanceState(x => x.CurrentState);

在执行此传奇时,此属性将在您定义状态属性时获得值ExecutingCompletedFailed

答案 1 :(得分:3)

您需要指定状态,以便在状态机定义中为其分配编号:

public class MySaga :
  MassTransitStateMachine<MySagaState>
{
    public MySaga()
    {
        InstanceState(x => x.State, Executing, Completed, Failed);
        // 1 = Initial, 2 = Final, 3 = Executing, 4 = Completed
        // 5 - Failed (1 & 2 are built-in states)
    }

    public State Executing { get; private set; }
    public State Completed { get; private set; }
    public State Failed { get; private set; }
    ...
}