帮助监视对象状态的自定义工作流

时间:2010-03-29 18:57:39

标签: .net-3.5 workflow-foundation

我需要编写一个监视对象状态的工作流。 (它可能要等几天或几小时才能改变一个州)

我对该对象有以下状态(我们称之为Issue对象):

1) Created
2) Unowned
3) Owned
4) UnAssigned
5) Assigned
6) In Progress
7) Signed Off
8) Closed

如果对象在某个定义的时间段内处于某种状态(我不确定如何实现),我还需要对某个对象采取一些操作。

对象的所有者/受让人可以随时更改(即从正在进行到未成为),所以我猜测状态机图是我需要使用的。  如果我的想法不正确,请告诉我。

我的应用程序是用c#.net 3.5编写的。

我正在考虑使用名为CreateIssue的服务方法,该方法将票证插入到数据库中,然后开始工作流的实例(将对象或对象的id作为参数)。 我不确定工作流程如何知道特定对象何时更新,或者对象的状态是否已更改。我已经使用Windows工作流基础3.5完成了一些非常简单的“hello world”类型的应用程序,但还没有掌握如何实现这样的实现。

任何方向都非常有帮助。

提前致谢。

2 个答案:

答案 0 :(得分:1)

基本方法是创建一个WorkflowService,定期检查数据库并将消息排入一个发送所需更改的消息。 worklfow活动告诉服务它在开始执行时正在等待什么以及它正在侦听的队列。收到所需消息后,活动将关闭。

答案 1 :(得分:1)

WF中没有任何机制可以自动检测对象何时发生变化 - 这将为您提供三种选择:

  1. 暂停工作流程,并在外部对象更改状态时使用外部代码恢复它。
  2. 在工作流程中,在While结构中添加Delay活动,该结构定期检查要监视的对象的更改。
  3. 在对象状态发生变化时触发的对象上发布事件。
  4. 选项1和2依赖于轮询机制 - 在一个案例中在工作流之外实现,在其他情况下在其中实现。选项3使用Subject / Observer模式和事件来在发生更改时通知工作流。

    选项3使用WF EventDrivenActivity - see the MSDN documentation here或一点wiki article about it here相对容易实现。从以下观点来看,此选项也是可取的:如果对象上存在一系列状态转换,则会向工作流通知每个状态 - 而轮询模型可能只接收最后一个(或者在轮询发生时发生的任何一个)

    如果您无法访问正在监视的对象的代码和/或无法更改对象的行为,则选项1和2是有意义的。在这些情况下,轮询几乎是您唯一的选择。

    要在1和2之间进行选择,您需要确定可能有多少同步工作流程,这些工作流程可能都在等待状态更改。当工作流可以暂停并写入持久存储时,WF可以很好地扩展 - 当数百(或数千)个活动工作流必须同时在内存中都处于活动状态时,它的扩展性会降低。如果您只期望一些长时间运行的工作流等待发生此类监视更改,您可以继续执行选项2(使用工作流延迟活动)。如果您期望有很多这样的工作流程,那么您最好在单独的线程中执行监视并暂停工作流程,直到有什么可以让他们去做。

    如果你选择选项2,请确保为工作流设计一个替代路径(超时,通知,状态等),以避免留下永远不会终止但继续消耗资源的活动孤立工作流