WF4实体状态处理,实体批处理

问题描述:

我在WF4中创建了一个简单的订单管理器wf服务(状态机)。WF4实体状态处理,实体批处理

simple state machine workflow

订单(EF实体)性质:身份证,IsExport,NumOfProduct,产品名称,状态(等待批准,拒绝)。

状态机状态:
1. OrderReceived(验证 - >响应活动)
2.等待(空) - 转换:
更新(更新订单活动) - >等待状态 批准(分配状态字段,更新订单和响应活动) - >最终状态
3.最终状态。

相关键:Order.Id

执行提出了几个问题。

  1. WF可以管理一个订单实例的流程,订单流程和订单实体处于一对一的关系。 问题是,我应该在哪里以及如何根据状态过滤器实现实体列表(例如批准的订单或等待订单)。该列表应该可以通过WCF服务方法访问。

  2. 管理批处理数据处理的最佳做法是什么? (例如:多订单批准。客户端中的“Foreach”不是所需的sln。)

  3. 订单的状态由“状态活动持久实例”和db中实体的状态字段。 决定实体状态的最佳实践是什么,将定义状态下的活动持久活动实例列出或根据状态过滤器参数从db中选择实体(通过活动)?

任何帮助,将不胜感激。

好的问题!

把你的第一个和第三个问题,有几种可能的方法来做到这一点。所有这些都需要您编写自定义WCF服务来枚举所需的订单。这可能是而不是是一个WF服务;它可能是REST或OData服务。你将如何实施这项服务?

  1. 您完全可以通过EF查询您的数据库来完成此操作。这完全不依赖于WF,可能是最简单的方法。您的工作流程将更新每个状态更改的数据库记录,并且该服务只需要读取该值。

  2. 您可以依赖WF提供的跟踪机制,以及Ron Jacobs在his answer to your question中提到的扩展。跟踪基础设施描述为here on MSDN。可以在内存中使用跟踪对象来获取活动工作流程的状态。但是,这可能不适用于IIS/WF服务,它们在休眠时会自动保留并卸载。使用跟踪工具将状态记录写入数据库会更好。您的自定义服务将仅查询此跟踪数据库。

除非你想约已通过您的WF服务发生的状态变化和更新的全面信息,建议头号应该足够了。

至于你的第二个问题,这有点复杂。假设您编写一个列出等待审批的订单的REST服务。您编写了一个显示这些订单的网页,用户可以检查他想要批准的订单。现在,您需要更新的工作流数与其批准的订单数相同。

正如你所说,你可以多次调用Web服务 - 但是对于大量的订单来说,这可能是不必要的开销。

有什么选择?您需要在采用一系列订单id的非WF服务上编写自定义服务方法。该服务将不得不多次调用您的WF服务来更新每个服务。由于WF服务是从同一台计算机上的另一个服务调用的,因此可以使用.Net命名管道绑定而不是其中一个HTTP绑定,以使开销更小。

值得注意的是Entity Framework不支持批量更新。如果你想要更新数据库,你需要编写一个存储过程或自定义SQL。

难道这一切都值得吗?大概!使用WCF和命名管道绑定对于WF来说是非常标准的。你需要configure Windows Activation Service for named pipes。另外,如果您还没有使用AppFabric for Windows Server,请查看它,因为它为WF服务添加了一些非常好的管理工具。

+0

非常准确,谢谢!关于第三个问题: 我知道:SM WF有一个状态,实体有一个状态/状态,这些状态不完全相同(并且SM也可以处理多个实体)。但是,如果您只通过状态机处理一个实体,并且SM的状态和实体的状态相同,那么如何避免该任务使实体的状态和状态字段保持同步(因为您存储在两个地方的信息)。 (实体的状态字段也必须从外部系统启用)我不想专注于同步。这就是我使用WF的原因。谢谢! – Boolish 2012-04-24 14:57:16

+0

我将SM状态视为“主”状态,将EF状态视为它的只读视图。如果你永远不会触摸EF状态(也许让setter私人),你应该没问题。但是在我看来,这是WF的一个潜在缺点:如果你的WF和你的分贝无法同步,那么解决这些问题可能很困难。 – Olly 2012-04-24 15:56:30

我最近发布了一些新的示例,以展示如何访问StateMachine的当前状态和可能的转换。这些可能会帮助你。

Windows Workflow Foundation (WF4) - Tracking State Machine Workflow Service Windows Workflow Foundation (WF4) - Tracking State Machine