.Net 狀態(tài)機(jī)Stateless
在 Stateless 庫中,可以通過配置來獲取狀態(tài)(State)、觸發(fā)器(Trigger)以及目標(biāo)狀態(tài)(Destination State)。以下是如何進(jìn)行配置的詳細(xì)說明:
1. 創(chuàng)建狀態(tài)機(jī)
首先,你需要?jiǎng)?chuàng)建一個(gè)狀態(tài)機(jī)實(shí)例。狀態(tài)機(jī)實(shí)例需要指定當(dāng)前狀態(tài)和觸發(fā)器類型。例如:
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
CopyInsert
在這個(gè)例子中,State 和 Trigger 是枚舉類型,State.OffHook 是初始狀態(tài)。
2. 配置狀態(tài)和觸發(fā)器
接下來,你可以配置每個(gè)狀態(tài)的行為,包括允許的觸發(fā)器和目標(biāo)狀態(tài)。例如:
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialed, State.Ringing);
CopyInsert
在這個(gè)例子中,當(dāng)狀態(tài)為 OffHook 時(shí),觸發(fā)器 CallDialed 會(huì)將狀態(tài)轉(zhuǎn)換為 Ringing。
3. 獲取當(dāng)前狀態(tài)和允許的觸發(fā)器
你可以通過 StateMachine.State 屬性獲取當(dāng)前狀態(tài),并通過 StateMachine.PermittedTriggers 屬性獲取當(dāng)前狀態(tài)下允許的觸發(fā)器。例如:
State currentState = phoneCall.State;
IEnumerable<Trigger> allowedTriggers = phoneCall.PermittedTriggers;
CopyInsert
4. 觸發(fā)狀態(tài)轉(zhuǎn)換
你可以通過 Fire 方法觸發(fā)狀態(tài)轉(zhuǎn)換。例如:
phoneCall.Fire(Trigger.CallDialed);
CopyInsert
這將觸發(fā)狀態(tài)從 OffHook 轉(zhuǎn)換到 Ringing。
5. 配置子狀態(tài)和初始狀態(tài)
如果你有子狀態(tài),可以通過 InitialTransition 方法配置初始子狀態(tài)。例如:
phoneCall.Configure(State.Connected)
.InitialTransition(State.OnHold);
CopyInsert
在這個(gè)例子中,OnHold 是 Connected 狀態(tài)的初始子狀態(tài)。
6. 異步觸發(fā)器
如果你需要處理異步操作,可以使用 FireAsync 方法。例如:
await phoneCall.FireAsync(Trigger.CallDialed);
CopyInsert
7. 導(dǎo)出狀態(tài)機(jī)圖
你可以將狀態(tài)機(jī)導(dǎo)出為 DOT 圖格式,以便可視化。例如:
string dotGraph = UmlDotGraph.Format(phoneCall.GetInfo());
CopyInsert
這個(gè)字符串可以被渲染為圖像,例如使用 Graphviz 工具。
8. 外部狀態(tài)存儲(chǔ)
如果你需要將狀態(tài)存儲(chǔ)在外部對(duì)象中,可以在創(chuàng)建狀態(tài)機(jī)時(shí)傳遞讀寫狀態(tài)的委托。例如:
var stateMachine = new StateMachine<State, Trigger>(
() => myState.Value,
s => myState.Value = s);
CopyInsert
在這個(gè)例子中,myState 是一個(gè)包含狀態(tài)值的對(duì)象。
9. 事件通知
你可以訂閱狀態(tài)轉(zhuǎn)換事件,以便在狀態(tài)轉(zhuǎn)換時(shí)執(zhí)行特定操作。例如:
phoneCall.OnTransitioned(t => Console.WriteLine($"Transitioned from {t.Source} to {t.Destination}"));
CopyInsert
10. 保護(hù)子句
你可以使用保護(hù)子句來決定在多個(gè)可能的轉(zhuǎn)換中選擇哪一個(gè)。例如:
phoneCall.Configure(State.OffHook)
.PermitIf(Trigger.CallDialed, State.Ringing, () => IsValidNumber);
CopyInsert
在這個(gè)例子中,IsValidNumber 是一個(gè)布爾函數(shù),用于決定是否允許轉(zhuǎn)換。

浙公網(wǎng)安備 33010602011771號(hào)