狀態機引擎


看到狀態,大家能想起什么?抵觸什么?

我想到的有:狀態機、狀態模式、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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM