我是 WF 的初学者,但我读过一本书并进行了大量谷歌搜索。我想写一个库存管理服务。库存由具有以下状态的单个项目组成:
- 备用
- 已安装
- 维修中
项目可能在每个状态下花费数月,并且有数千个项目。
问题是,我是否为所有不同的状态创建一个状态机工作流?或者我是否创建用于在状态之间转换的工作流?
如果我理解正确的话,如果我创建一个单一的状态机工作流,那么每个项目总会有一个工作流在运行。这意味着数以千计的不断运行的工作流程。此外,我需要能够显示每个项目状态的快照,这意味着我必须以某种方式查询所有工作流以了解它们当前所处的状态,或者以其他方式在每次状态转换后持久保存到数据库中。
但是,状态机工作流在逻辑上听起来是正确的做法,因此我陷入了困境。
如果可以,请帮助我:-)
谢谢!
更新:
假设我的状态比上述 3 种更多,并且并非所有状态转换都是可能的。
赏金获得者:Maurice - 感谢其他所有人真正帮助我更多地了解工作流、MS 工作流基础和其他更轻量级的替代方案。不幸的是,只有一个赏金获得者,Maurice 的回答及其评论对我帮助最大。
最佳答案
状态机是一种非常强大的实现技术,尽管我建议您考虑一个名为 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 工作流所需的多个项目相比,您可以在一个程序集中实现这一点。维护成本极低,他们没有为您生成代码的“设计师”,等等。同样,它很简单,而且很美。
关于c# - 工作流设计困境——状态机,yes or no,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1966950/