bbv.Common.StateMachine
class 是我见过的最好的状态机代码。但它只缺少一件事:获取当前状态。
这是一个订单跟踪系统:
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
为每个州都写会很麻烦,因为我会重复自己!
必须有一个微妙的方法来做到这一点。