2017-04-05 81 views
0

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

举例来说,如果我有一个状态机类三种状态:

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

而且我的状态机实例类有一个“国家”财产

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

如何MT决定哪些传奇状态是哪个整数?

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

回答

2

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

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

我真的会建议使用string,因为它更容易绘制,而且没有混淆。

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

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

你还应该配置状态机状态对象的状态机的构造国有产权:

InstanceState(x => x.CurrentState); 

沿着这个执行萨加,这个属性将得到值Executing,CompletedFailed,因为你已经定义了状态属性。

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; } 
    ... 
}