2010-03-29 28 views
3

我需要编写一个监视对象状态的工作流程。 (这可能等待数天或数小时的状态改变)帮助处理监视对象状态的自定义工作流程

我有对象以下状态(可以称之为一个发行对象):

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

我还需要采取一些行动在一个对象上,如果对象在一定的时间内处于特定的状态(不确定如何实现这一点)。

该对象的所有者/受让人可以随时更改(即从进行中转移到未开启),所以我猜测状态机图是我需要使用的。 如果我的想法不正确,请让我知道。

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

我在想有一种名为CreateIssue的服务方法,它将插入票据到数据库,然后开始一个工作流的实例(以对象或对象的ID作为参数)。 我不确定工作流将如何知道特定对象何时被更新,或者对象的状态是否已更改。我已经做了一些非常简单的“hello world”类型的应用程序与Windows工作流基础3.5,但还没有掌握如何去执行这样的事情。

对此的任何方向都会非常有帮助。

在此先感谢。

回答

1

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

+0

该工作流程将如何启动/启动? – AlteredConcept 2010-03-30 00:08:33

+0

啊,我的印象是你已经有了一个正在运行的工作流程。在新工作表的情况下,你需要做的就是使用WorkflowRuntime来启动它,通过输入字典传递你想要的数据, – Maurice 2010-03-30 06:31:17

+0

我已经修改了我的原始文章,并详细说明了我想要完成的工作。 – zSynopsis 2010-03-31 03:03:04

1

没有机制内WF到直接当一个对象已经改变自动检测 - 这让你有三个选择:

  1. 挂起的工作流程,并利用外部代码来恢复它当外部对象改变状态。
  2. 在工作流程内,在While结构中添加一个Delay活动,该活动定期检查被监视的对象是否有变化。
  3. 在对象状态发生变化时触发的对象上发布事件。

选项1和选项2依赖于轮询机制 - 在一种情况下在工作流之外实现,在其他情况下实现在其中。选项3使用包含事件的主题/观察者模式在发生更改时通知工作流程。

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

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

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

如果您确实使用了选项2,请确保为工作流设计了一个替代路径(超时,通知,状态等),以避免离开不会终止但继续消耗的孤立活动工作流资源。