1

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

简单的状态机工作流程

订单(EF 实体)属性:Id、IsExport、NumOfProduct、ProductName、Status(等待、批准、拒绝)。

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

相关键:Order.Id

实施提出了一些问题。

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

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

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

任何帮助,将不胜感激。

4

2 回答 2

1

好问题!

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

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

  2. 您可以依赖 WF 提供的跟踪机制,以及 Ron Jacobs 在回答您的问题时提到的扩展。跟踪基础结构在 MSDN 上进行了描述。可以使用内存中的跟踪对象来获取活动工作流的状态。但是,这可能不适用于 IIS/WF 服务,这些服务在休眠时会自动持久化和卸载。您最好使用跟踪工具将状态记录写入数据库。然后,您的自定义服务将只查询此跟踪数据库。

除非您想要有关通过 WF 服务发生的状态更改和更新的全面信息,否则第一个建议就足够了。

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

正如您所提到的,您可以多次调用 Web 服务,但对于大量订单,这将是不必要的开销。

有什么选择?您需要在您的非 WF 服务上编写一个自定义服务方法,该方法采用一组订单 ID。该服务必须多次调用您的 WF 服务才能更新每个服务。由于 WF 服务是从同一台机器上的另一个服务调用的,因此您可以使用 .Net 命名管道绑定而不是 HTTP 绑定之一,这样开销就会少得多。

值得注意的是,Entity Framework 也不支持批量更新。如果您也希望批量更新数据库,则需要编写存储过程或自定义 SQL。

这一切值得努力吗?大概!使用 WCF 和命名管道绑定是 WF 的标准。您需要为命名管道配置 Windows 激活服务。此外,如果您尚未使用AppFabric for Windows Server,请查看它,因为它为 WF 服务添加了一些非常好的管理工具。

于 2012-04-19T18:05:14.500 回答
0

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

Windows Workflow Foundation (WF4) - 跟踪状态机工作流服务 Windows Workflow Foundation (WF4) - 跟踪状态机

于 2012-04-12T17:43:19.037 回答