如果您正在尋找基於.Net的高性能狀態機,我會推薦Stateless。下面是該項目的網站摘錄:
大多數標準狀態機結構的支持:對國家和任何.NET類型的 觸發
- 通用支持(數字,字符串 ,枚舉,等等。)
- 分層狀態進入/退出 事件狀態
- 保護條款,支持有條件的 過渡
- 自省,還提供
一些有用的擴展:
- 能力來存儲狀態外部 (例如,在由Linq to SQL跟蹤的 屬性中)
- 參數化的觸發
- 折返狀態
配置如下:
var phoneCall = new StateMachine<State, Trigger>(State.OffHook);
phoneCall.Configure(State.OffHook)
.Permit(Trigger.CallDialed, State.Ringing);
phoneCall.Configure(State.Ringing)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.CallConnected, State.Connected);
phoneCall.Configure(State.Connected)
.OnEntry(() => StartCallTimer())
.OnExit(() => StopCallTimer())
.Permit(Trigger.LeftMessage, State.OffHook)
.Permit(Trigger.HungUp, State.OffHook)
.Permit(Trigger.PlacedOnHold, State.OnHold);
// ...
phoneCall.Fire(Trigger.CallDialled);
Assert.AreEqual(State.Ringing, phoneCall.State);
而且好處是,因爲它實現了泛型,你可以使用int或字符串來表示狀態和觸發器,使您可以非常輕鬆地與數據庫或ORM進行集成。美妙之處在於沒有額外的運行時主機,您不必擔心,只需從對象或記錄中加載當前狀態的狀態機,即可。