如果你可以使用一个状态机,那么我建议叫StateLess by Nicholas Blumhardt (Autofaq creator)一个开源项目。他的方法避免了运行时引擎持久运行的工作流的问题,因为状态是由诸如字符串或int之类的简单变量定义的。
下面是一个简单的状态机:
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工作流的多个项目:这可以在状态机的构造函数如下设置。维护是非常低的,没有“设计师”为您生成代码等等。再次,它很简单,而且还有美感。
+1代码示例。 – georgiosd 2012-05-07 19:55:07