我是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个状态。状态如何完成整数映射?
答案 0 :(得分:3)
State
属性表示当前的状态机状态。只要状态机进入另一个状态,它就会改变。
它可以是复杂类型State
或原始类型string
或int
。第一种情况,如果使用数据库持久性,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);
在执行此传奇时,此属性将在您定义状态属性时获得值Executing
,Completed
或Failed
。
答案 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; }
...
}