C#学习教程:工作流设计困境-状态机,是或否。我正在尝试编写库存管理服务。库存由具有以下状态的单个项目组成:备件已安装在维修项目可能在每个状态下花费数月,并且有数千个项目。问题是,我是否为所有不同的状态创建一个状态机工作流?或者我是否创建一个在状态之间转换的工作流?如果我理解正确的话,如果我创建一个单一的状态机工作流,那么工作流将始终为每个项目运行。这意味着数千个不断运行的工作流程。此外,我需要能够显示每个项目状态的快照,这意味着我必须以某种方式查询所有工作流以了解它们当前所处的状态,或者以其他方式在每次状态转换后持久保存到数据库中。然而,状态机工作流在逻辑上听起来像是正确的事情,因此我陷入了困境。如果可以,请帮助我:-)谢谢!更新:假设我的状态比上面的3个多,并且并非所有状态转换都是可能的。赏金获得者:Morris-感谢所有其他真正帮助我了解更多有关工作流、MS工作流基础知识和其他更轻量级替代方案的人。不幸的是,只有一个赏金获得者,莫里斯的回答和他的评论对我帮助最大。不确定工作流程是否是您想要的。工作流是发生的某种业务流程。这意味着过程的开始和结束。您的描述听起来更像是跟踪包含库存项目的库存。当项目改变状态时,工作流声音更合适。例如,当一个项目安装失败并需要修理时,您启动一??个工作流,用工作部件替换该部件,将损坏的部件发送到固定部件,最后将其作为固定部件返回仓库。空闲的。工作流将描述此过程,并以物品损坏的报告开始,以修理或丢弃和更换物品结束。最终的工作流很可能是状态工作流,因为项目会经历不同的阶段,例如:简单的状态机实现,避免了不必要的Windows工作流复杂性。他的方法避免了运行时引擎持有的长时间运行的工作流问题,因为状态是由一个简单的变量定义的,例如字符串或整数。这是一个示例状态机:varphoneCall=newStateMachine(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())。允许(Trigger.LeftMessage,State.OffHook).Permit(Trigger.HungUp,State.OffHook).Permit(Trigger.PlacedOnHold,State.OnHold);//...phoneCall.Fire(Trigger.CallDialled);Assert.AreEqual(State.Ringing,phoneCall.State);您的状态可以是一个整数,允许您提供来自数据库的当前状态。这可以在状态机的构造函数上设置如下:varstateMachine=newStateMachine(()=>myState.Value,s=>myState.Value=s);与运行WindowsWorkflow所需的多个项目相比,您只需在一个程序集中实现此功能。维护成本很低,他们不是为您的代码生成代码的“设计师”。同样,它很简单,而且很漂亮。鉴于您的添加(超过3个状态,并非所有转换都被允许),我将执行以下操作:将每个项目的状态存储在项目本身中。这可以很容易地实现:如其他帖子/评论中已经提到的,将成员添加到类或将列添加到表等。使用状态机(这可以是从类的实例到具有合法转换的表的任何东西)来保存您的业务逻辑,即状态之间允许的转换以及当项目更改其状态时要执行的其他操作的知识。您需要做的就是使用状态机转换您的项目,每当发生外部事件时,强制/暗示这一点。好的。看看我能不能帮你。让我们从设计开始:设计状态机和工作流是有意义的。两者都只是以不同的眼光看待您的问题,并从不同的角度来构建它。事实上,不熟悉工作流的开发人员经常会设计状态机而不是工作流。工作流过程视图主要切换图中框和转换的角色:框是可以更改状态的活动-在转换时,工作项可以进入新状态(好吧,这在科学上不正确,但它可能会有所帮助:-)对我来说,状态机方面似乎更重要。因此,将您的软件实现为状态机。是的——您应该使所有项目都持久保存在数据库中。这就是您运行长时间运行的工作流的方式-它们存在于数据库中,直到它们被任何活动重新激活。这就是货架业务流程管理系统(BPMS)的作用。这些工作流不保存在内存中。将所有内容保存在数据库中可以轻松创建报告。正如其他人已经提到的那样,创建一个包含状态信息的新列,甚至是一个包含元数据的新表:状态,可能是状态更改时间的日志,谁更改了状态,即将发生的事件的信息(零件已订购)但不是已交付-如果交付丢失,有人必须与供应商核实多少天?).这将使您有机会根据需要添加元数据,而不会影响您的零件数据库。希望有帮助!正如在对原始帖子的评论中所讨论的,我对使用WF完全解决这个问题有一些疑问。“每个州的项目可能需要几个月,并且有数千个项目”这句话是触发因素:我相信工作流(使用WF建模)应该更短。虽然对于WF实例可以或应该存在多长时间没有硬性规定,但数月甚至数年可能会触发我的“越界”异常,尤其是当这是数千个项目中非常普遍的情况时:-)在您的评论中使用WF的原因是有效的,但没有解决问题。因此,我建议您使用寿命较短的专用WF模型来处理库存项目状态之间发生的情况,但不要在WF状态中捕获项目状态本身。长期存在的、很少改变的状态更适合数据库引擎,因为它们很容易被报告。虽然状态机模式在技术上是正确的选择,但也可以选择使用一个巨大的循环来创建顺序工作流。在某些情况下,它实际上更好、更容易理解。你有三种不同的状态,据我所知,所有的转变都是允许的。鉴于此,我不会为检查允许的转换并继续前进的一段代码意义上的状态机而烦恼。当州政府推动业务或需要一个单一的可信代码是负责“有效转换”的唯一参与者时,状态机就有意义了。更简单地说,您只需要在任何时间点具有给定状态的实体......Aviad,我同意你的观点,工作流应该在状态之间。库存部件的状态听起来像是物品的状态/属性。这种状态几乎可以以任何方式存储(例如数据库、文件...),因为状态之间的项目移动将存在于业务逻辑层中。听起来是个有趣的项目,祝你好运。我认为我们需要在这里了解一些事情。状态机-将专注于表示您的实体所处的特定状态。WorkFlow-将定义您将实体从初始状态移动到最终状态所遵循的过程。在您的情况下,由于您的整个过程围绕一个实体,并且它在任何给定时间点的当前状态都是单例,所以我建议使用状态机。建议:ApacheCommonsSCXML提供了一个轻量级、可嵌入的状态机引擎,可以在应用程序运行时轻松配置和自定义。关键是您必须以实体状态转换之间的方式定义scxml-您可以使用“操作”或“侦听器”来指定要执行的工作流。示例程序:https://www.javacodegeeks.com/2012/06/apache-commons-scxml-finite-state.html关于CommonsSCXML2.0的更多信息https://events.linuxfoundation.org/sites/events/files/slides/ApacheConUS2014%20-%20Apache%20Commons%20SCXML%202.0.pdf以上就是C#学习教程:工作流设计困境-状态机,yesorno分享全部内容,如果对大家有用需要了解更多关于C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
