工作流设计困境 - 状态机,是或否

Avi*_* P. 15 .net c# workflow workflow-foundation

我是WF的初学者,但我读了一本书并做了很多谷歌搜索.我想写一个库存管理服务.库存由具有以下状态的单个项目组成:

  1. 备用
  2. 安装
  3. 在维修

物品可能在每个州花费数月,并且有数千种物品.

问题是,我是否为所有不同的状态创建状态机工作流程?或者我是否创建了在州之间转换的工作流程?

如果我理解正确,如果我创建单个状态机工作流程,那么将始终为每个项目运行工作流程.这意味着数千个不断运行的工作流程.此外,我需要能够显示每个项目状态的快照,这意味着我必须以某种方式查询它们当前所处状态的所有工作流程,或者在每次状态转换后以其他方式持久保存到数据库.

然而,状态机工作流在逻辑上听起来是正确的事情,因此我的困境.

如果可以,请你帮助我 :-)

谢谢!

更新:

假设我有比上面3更多的状态,并且不是所有状态转换都是可能的.

赏金获奖者:莫里斯 - 感谢所有其他人真正帮助我更多地了解工作流程,MS工作流程基础以及其他更轻量级的替代方案.不幸的是,只有一个赏金赢家,莫里斯的回答及其评论对我帮助最大.

Dav*_*ins 22

状态机是一种非常强大的实现技术,虽然我建议您考虑一个名为StateLess的框架,由Nicholas Blumhardt(Autofaq创建者),因为它是一个非常简单的状态机实现,可以避免不必要的Windows Workflow复杂性.他的方法避免了运行时引擎持有的长时间运行工作流的问题,因为状态是由一个简单的变量(如字符串或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);
Run Code Online (Sandbox Code Playgroud)

您的状态可以是一个整数,允许您从数据库中提供当前状态.这可以在状态机的构造函数上设置如下:

var stateMachine = new StateMachine<State, Trigger>(
    () => myState.Value,
    s => myState.Value = s);
Run Code Online (Sandbox Code Playgroud)

与运行Windows Workflow所需的多个项目相比,您只需在一个程序集中实现此功能.维护是非常低的,他们不是为你的代码生成代码的"设计师".再次,它很简单,并且有美丽.


Mau*_*ice 9

不确定工作流程是否符合您的要求.

工作流是一种发生的某种业务流程.这意味着该过程的开始和结束.您的说明听起来更像是跟踪库存中包含物品的库存.

当项目改变状态时,工作流声音更合适.例如,当一个项目被安装并且发生故障并且需要修复时,您将启动一个工作流程以将部件替换为工作部件,将损坏的部件发送到固定部分,最后将其作为固定部件返回仓库.备用.工作流程将描述此过程,并从项目被破坏的报告开始,并以修复或丢弃和替换项目结束.

最后的工作流程很可能是一个状态工作流,因为该项目经历了各个阶段,如:

  • 破碎并安装
  • 破碎和更换
  • 在商店进行维修
  • 修复
  • 等等