.Netベースの高性能ステートマシンをお探しの場合は、ステートレスをお勧めします。プロジェクトサイトからの抜粋は次のとおりです。
ほとんどの標準的なステートマシン構造がサポートされています。
- 任意の.NETタイプ(数値、文字列、列挙型など)の状態とトリガーの一般的なサポート
- 階層状態状態の開始/終了イベント
- 条件付き遷移をサポートするGuard句
- イントロスペクション
いくつかの便利な拡張機能も提供されています。
- 状態を外部に保存する機能(たとえば、Linqから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);
また、Genericsを実装しているため、intまたはstringを使用して状態とトリガーを表すことができ、データベースまたはORMと非常に簡単に統合できます。美しさは、心配する必要のある追加のランタイムホストがないことです。オブジェクトまたはレコードから現在の状態をステートマシンにロードするだけで、準備は完了です。