状态机是一种非常强大的技术实现方式,虽然我建议您考虑一个叫做StateLess by Nicholas Blumhardt (Autofaq creator)的框架,因为它是一种非常简单的状态机实现,避免了Windows Workflow不必要的复杂性。他的方法避免了长时间运行的工作流被运行时引擎占用的问题,因为状态由简单的变量(如字符串或整数)定义。
这是一个示例状态机:
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);
您的状态可以是一个整数,这将允许您从数据库中获取当前状态。可以在状态机的构造函数中设置如下:
var stateMachine = new StateMachine<State, Trigger>(
() => myState.Value,
s => myState.Value = s)
相对于运行Windows Workflow所需的多个项目,您只需要一个程序集即可实现此功能。维护成本极低,没有“设计者”为您生成代码等。再次强调,它很简单,这就是其美妙之处。