博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

WF4实现工作流驳回流转模型的几种设计方案

Posted on 2010-04-21 13:04  生鱼片  阅读(6221)  评论(13编辑  收藏  举报

WF4是微软最新的工作流框架,其中我们可以实现顺序型的和FlowChart的工作流,利用FlowChart我们可以实现复杂的流转,本文就讨论一下关于WF4实现工作流流转中一个很普通的模型驳回的设计。

 

先说说驳回的流转模型,一个流程会有很多节点,每个节点都可以做核可和驳回的动作,在驳回的时候就有几种方式,最常见的驳回到申请者或者驳回到前一节点。而驳回后重新呈现的流程也几种方式,一种是同正常核可流程,另一种是回到驳回者。

 

下面是几种设计方案:

方案一:利用流程图直接设计

FlowChart中我们可以通过FlowDecision来判断,根据节点的动作来路由下一步走到哪里,如下图:

clip_image002

上面的图可以实现驳回的设计,但是有一个缺点,就是当节点过多的时候FlowDecision的判断也非常多,会让流程图看起来很乱,基于这个我做了如下的改进,图如下:

clip_image004

这种方式我将所有需要审核的节点放到一个审核流程的活动中,作为其子活动,审核流程在执行其子活动时如果遇到驳回的就不再继续向下执行,退出该活动,将单据设置为驳回状态,然后在使用FlowDecision进行判断,这就解决了上面的问题,当然审核流程这些都是您要自定义开发的活动。

 

方案二:操作持久化数据

我们在工作流需要审核的时候会设置一个Bookmark等待审核者作出处理,这个时候工作流就进入Idle状态,进行持久化。我们将每次持久化的数据都备份起来,当驳回的时候将原备份的持久化恢复,工作流自然就回退了。通过我测试发现这种方式不太稳定,大家可以测试下。

 

方案三:维护状态信息

WF4本身的工作流有一组状态信息,不过我们一般在使用的时候都会在维护一组状态信息,基于此我只要维护好自己的状态也可以实现驳回。这个时候WF的工作流就是辅助作用,在驳回的时候可以有两种方式处理,一种是驳回后重送的流程同核可的流程时可以直接终止或结束当前工作流,重新送出时在新建一个流程实例,另一种就是驳回后重送回到驳回者时WF的工作流当前的Bookmark不做任何更改,只去更新我们自己的状态信息,重送后核可恢复Bookmark流程继续向下执行。

方案四:状态机!状态机

个人认为这种方式是最好的实现方式,可惜的是WF4目前还没有状态机模型,不过这里有一个好消息,就是小道消息得知WF4的状态机快要放出来了,下面是我唯一能找到的一张图片:

clip_image006

 

你有什么好的方法,请拿出来大家一起讨论讨论,如果本文对你有帮助可以推荐一下本文。