看到狀態,大家能想起什么?抵觸什么?
我想到的有:狀態機、狀態模式、UML狀態轉換、一堆一堆的驗證能否執行當前函數的驗證代碼
抵觸的有:UML狀態機圖
如下:
正視狀態圖
- 只要有先后順序的行為都可以想象成狀態機,因為存在必須先做什么才能再做什么的現象,所以這種現象很常見,很普遍
- 給出了流程圖后,落實到代碼級別還是要細化很多的,其中一部分就是狀態轉換鏈
- 有了狀態圖,領域對象的行為就可以被先后順序的mapping,但還得寫一堆的驗證,來判斷狀態能否執行當前函數
因此認為需要有個框架來把這些麻煩事做掉,於是有了SMFramework框架->StateMachineFramework
判斷是否能進行某項操作:
string requestId = .................//業務主鍵ID var canExecute=SMF.Get<交易修改申請>(requestId).CanTransitToState("已提交申請"); Console.WriteLine(string.Format("能否切換到 已提交申請 狀態?{0}", canExecute));
真正狀態切換代碼:
string requestId = .....................//業務主鍵ID SMF.Get<交易修改申請>(requestId).TransitToState("已提交申請"); SMF.Get<交易修改申請>(requestId).TransitToState("審核拒絕", () => { Console.WriteLine("..."); .... .... });
框架支持多種輸入參數,其中Action
- 為空
- 先判斷狀態機當前的狀態是否可以被切換到目標狀態,如不能則拋錯
- 切換狀態機狀態(也持久化)
- 不為空
- 先判斷狀態機當前的狀態是否可以被切換到目標狀態,如不能則拋錯
- 執行傳入的Action
- 切換狀態機狀態(也持久化)
其實還有一個參數:transactionSupport,默認為false
- false,代表Action動作與狀態機持久化行為不會放在一個事務中執行
- true,代表Action動作與狀態機持久化行為是放在一個事務中執行的
那么狀態機的定義又在哪里呢?
class 交易修改申請 : StateMachineConfig { protected override void States() { this.AddCanbeBeginState("已提交申請"); this.AddAutoTransitToCompleteState("審核通過"); this.AddAutoTransitToCompleteState("審核拒絕"); this.AddAutoTransitToCompleteState("取消"); } protected override void Links() { this.LinkStates("已提交申請", "審核通過"); this.LinkStates("已提交申請", "審核拒絕"); this.LinkStates("已提交申請", "取消"); } protected override string MachineType() { return "交易修改申請"; } }
StateMachineConfig是一個抽象類,需要具體實現類實現3個函數,分別是
- States
- 函數
- 在這里定義具體的狀態名以及狀態相應的屬性
- CanBeginState
- 代表在某個具體業務主鍵ID的狀態機轉換序列中,初始化時就能無條件切換過去的狀態
- AutoTransitToCompleteState
- 代表當切換到這個狀態后,就被認為是完成了,既:狀態轉換完結。
- 函數
- Links
- 添加兩個狀態之間的單向關系(不是雙向)
- MachineType
- 狀態機定義名稱
目前第一版已經上傳到github上
https://github.com/daibinhua888/StateMachine/