2017-04-05 66 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; } 
    ... 
}