bbv.Common.StateMachine
クラスは私が今まで見た中で最高のステートマシンコードです。しかし、それはただ1つのことを欠いています:現在の状態を取得することです。
これは注文追跡システムです:
fsm = new ActiveStateMachine<States, Events>();
fsm.In(States.OrderCreated)
.On(Events.Submitted)
.Goto(States.WaitingForApproval);
fsm.In(States.WaitingForApproval)
.On(Events.Reject)
.Goto(States.Rejected);
fsm.In(States.WaitingForApproval)
.On(Events.Approve)
.Goto(States.BeingProcessed);
fsm.In(States.BeingProcessed)
.On(Events.ProcessFinished)
.Goto(States.SentByMail);
fsm.In(States.SentByMail)
.On(Events.Deliver)
.Goto(States.Delivered);
fsm.Initialize(States.OrderCreated);
fsm.Start();
fsm.Fire(Events.Submitted);
// Save this state to database
あなたはそれがどのように簡単に機能するかを見ることができます。
しかし、注文状態をデータベースに保存したいと思います。だから私はどの状態で注文であるかを示すことができます。
私は〜が必要です
fsm.GetCurrentState()
//show this state in the a table
方法。ExecuteOnEntry
実際には方法があります。すべての州のエントリでローカル値を使用および変更できます。ExecuteOnEntry
しかし、私は自分自身を繰り返すので、すべての州について書くのは面倒です!
それを行うには繊細な方法が必要です。