Avi*_* P. 15 .net c# workflow workflow-foundation
我是WF的初学者,但我读了一本书并做了很多谷歌搜索.我想写一个库存管理服务.库存由具有以下状态的单个项目组成:
物品可能在每个州花费数月,并且有数千种物品.
问题是,我是否为所有不同的状态创建状态机工作流程?或者我是否创建了在州之间转换的工作流程?
如果我理解正确,如果我创建单个状态机工作流程,那么将始终为每个项目运行工作流程.这意味着数千个不断运行的工作流程.此外,我需要能够显示每个项目状态的快照,这意味着我必须以某种方式查询它们当前所处状态的所有工作流程,或者在每次状态转换后以其他方式持久保存到数据库.
然而,状态机工作流在逻辑上听起来是正确的事情,因此我的困境.
如果可以,请你帮助我 :-)
谢谢!
更新:
假设我有比上面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所需的多个项目相比,您只需在一个程序集中实现此功能.维护是非常低的,他们不是为你的代码生成代码的"设计师".再次,它很简单,并且有美丽.
不确定工作流程是否符合您的要求.
工作流是一种发生的某种业务流程.这意味着该过程的开始和结束.您的说明听起来更像是跟踪库存中包含物品的库存.
当项目改变状态时,工作流声音更合适.例如,当一个项目被安装并且发生故障并且需要修复时,您将启动一个工作流程以将部件替换为工作部件,将损坏的部件发送到固定部分,最后将其作为固定部件返回仓库.备用.工作流程将描述此过程,并从项目被破坏的报告开始,并以修复或丢弃和替换项目结束.
最后的工作流程很可能是一个状态工作流,因为该项目经历了各个阶段,如:
| 归档时间: |
|
| 查看次数: |
7183 次 |
| 最近记录: |