MassTransit Saga 状态到实例状态映射
MassTransit Saga State to Instance State Mapping
我是 MassTransit 的新手,我似乎无法弄清楚它如何将我在 saga (MassTransitStateMachine) 上定义的状态映射到相关的 "State" 属性 SagaStateMachineInstance class。
例如,如果我有一个具有三个状态的状态机class:
public class MySaga :
MassTransitStateMachine<MySagaState>
{
public State Executing { get; private set; }
public State Completed { get; private set; }
public State Failed { get; private set; }
...
}
我的状态机实例 class 有一个 "State" 属性
public class MySagaState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public int State { get; set; }
}
MT如何决定哪个saga状态是哪个整数?
似乎还有两个内置的 saga 状态,"Initial" 和 "Final",所以这个例子会有 5 个状态。 State 到整数的映射是如何完成的?
State
属性表示当前状态机状态。只要状态机进入另一个状态,它就会改变。
它可以是复杂类型State
或原始类型string
或int
。第一种情况,如果使用数据库持久化,State
对象的Name
属性会被存储到数据库中。如果您使用 string
(所有 MassTransit 示例都建议这样做)- 显然 属性 将包含状态名称,代表状态机 属性 名称。如果您使用 int
- 通过查看值是最难理解的,因为它已经成为约定俗成的零状态,1 是初始状态,2 是最终状态,3 之后代表所有其他状态.
我真的建议使用 string
,因为它更容易映射并且不会混淆。
因此您的 saga 状态将如下所示:
public class MySagaState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string CurrentState { get; set; }
}
你还应该在状态机构造函数中配置状态机状态对象的状态属性:
InstanceState(x => x.CurrentState);
随着这个 saga 的执行,这个 属性 将获得值 Executing
、Completed
或 Failed
,因为您已经定义了状态属性。
您需要指定状态,以便在状态机定义中为它们分配编号:
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; }
...
}
我是 MassTransit 的新手,我似乎无法弄清楚它如何将我在 saga (MassTransitStateMachine) 上定义的状态映射到相关的 "State" 属性 SagaStateMachineInstance class。
例如,如果我有一个具有三个状态的状态机class:
public class MySaga :
MassTransitStateMachine<MySagaState>
{
public State Executing { get; private set; }
public State Completed { get; private set; }
public State Failed { get; private set; }
...
}
我的状态机实例 class 有一个 "State" 属性
public class MySagaState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public int State { get; set; }
}
MT如何决定哪个saga状态是哪个整数?
似乎还有两个内置的 saga 状态,"Initial" 和 "Final",所以这个例子会有 5 个状态。 State 到整数的映射是如何完成的?
State
属性表示当前状态机状态。只要状态机进入另一个状态,它就会改变。
它可以是复杂类型State
或原始类型string
或int
。第一种情况,如果使用数据库持久化,State
对象的Name
属性会被存储到数据库中。如果您使用 string
(所有 MassTransit 示例都建议这样做)- 显然 属性 将包含状态名称,代表状态机 属性 名称。如果您使用 int
- 通过查看值是最难理解的,因为它已经成为约定俗成的零状态,1 是初始状态,2 是最终状态,3 之后代表所有其他状态.
我真的建议使用 string
,因为它更容易映射并且不会混淆。
因此您的 saga 状态将如下所示:
public class MySagaState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string CurrentState { get; set; }
}
你还应该在状态机构造函数中配置状态机状态对象的状态属性:
InstanceState(x => x.CurrentState);
随着这个 saga 的执行,这个 属性 将获得值 Executing
、Completed
或 Failed
,因为您已经定义了状态属性。
您需要指定状态,以便在状态机定义中为它们分配编号:
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; }
...
}