WF-Activity高级篇-Conditioned Activity Group (CAG)

Conditioned Activity Group (CAG)

CAG定义了一组基于条件特征/条件驱动的Activity,允许你通过定义条件触发CAG组中的某个Activity,这样使得你可以灵活的定义一些动作来实现现实的场景:

  • 依据某个条件激发CAG中某个的Activity
  • 依据某些条件激发一部分或所有的Activity
  • CAG中的所有Activity交替运行(条件依赖)
  • CAG组中的Activity可选的并行运行
  • 并行的执行多个子流程
  • 循环动作,直到CAG的Until 条件被满足

CAG 中有多个条件特性的Activity组成,其中的每个Activity又可以是一个Activity或由多个Activities组成的一个子流程序列,CAG中用一个When的条件特性来标识其中的每一个Activity,而且允许When条件一样的多个Activities存在一个CAG中。

我常常用吃牛排的工具箱来想像CAG,工具箱就是CAG,工具箱中有餐刀、有叉子,有双面刀(一面带锯齿一面是刀口),还有两用刀等等等等。那么这每一种工具就是一个Activity,这些Activity有的是单一的Activity,比如叉子,也有多个Activities组成的一个子流程序列,比如双面刀,两用刀。每个工具都有自己的用途(When条件),而且也允许你的工具箱中放两把一样的餐刀

CAG中的各个Activity 都有一个When Condition 表示当这个条件满足时,其中的Activity 会执行一次When Condition 有两种方式,一种是System.Workflow.Activities.CodeCondition 一种是 System.Workflow.Activities.Rules.RuleConditionReferences,你可以用代码或者是规则库的方式决定什么样的情况下Activity 会运行。
CAG 自己还有一个Until condition 属性,这个是CAG退出的条件。当Until condition 的条件满足(为True),那么意味目前CAG组中没有子的Activities 在运行并且也没有任何一个Activities的When Condition 条件被满足了。

CAG的执行逻辑也非常简单,开始的时候,它会首先评估Until 条件是否满足,如果Until =True,那么CAG就退出和执行完毕了,否则CAG开始检测组中所有Activities 的When条件有没有满足的,如果有那么它将调度执行(scheduled for execution)这个子Activity。组中任何一个子Activity 执行完毕后,CAG的Until 和其中的每个Activities的When 条件都会被重新评估一次。
这个子Activity 是指CAG中的一个Activity,也就是CAG最一排中的一个图标代表的Activity,因为这一个Activity 下面可以是一个Activity,也可以是一个由其他多个Activities组成的一个子流程,所以如果是子流程的情况,那么重新评估,是在整个子流程被执行完之后立即执行,而子流程中的每个Activity执行完后并不会进行重新评估。

使用的上面的比方,那么你可以这么想像,每当你咀嚼完一口牛肉,将它咽下肚子的时候,代表其中的一个Activity执行完毕,你会放下手中的工具,看看是否还有牛肉可以吃,如果有,那么你重新检测一下工具箱中的所有餐具,看看谁比较合适来切下牛排的这个部分,然后拿起这个工具,开始执行,比如横着切三刀,用叉子叉起,然后放到嘴中,咀嚼和品位,喝点葡萄酒,然后咽下;直到牛排全部吃完、或者你发现剩下的部分已经无法用工具箱中的工具切割放到你嘴中时,你发现自己已经吃饱或无法再吃了(满足Until条件了)。在每次咀嚼和品味之前,你可以用一个工具,也可以左手右手使用两个工具来切割和分解牛排。

整个的情形有些像下面的伪代码
Whlie ( Until !=true && ActivitiesInCAG.When !=true )
{
  foreach ( Activity in ActivitiesInCAG )
  {
    if ( Activity.When == true )
    {
    scheduled for execution it ;
     WaitHandle.Set() for Reevaluation
    }
  }
}

WF Beta2 中有一个ConditionalEventArgs 类型,你可以设置 e.Result = true/false 来确定/更改When或Until 的条件是否满足。

我最喜欢使用CAG的模式是用它来代替状态机工作流(State Machine workflow),比如你生成一个工单之后,会有取消工单,关闭工单等等一些操作,那么这些修改工单状态的操作,我就会把它们变成多个HandleExternalEvent ,放在一个CAB组中,然后我就可以将这些事件对应到一个LCS(Local Communication Services ) 的方法,然后在工作流之外非常容易的激发这个事件,从而修改工单的状态,往往工单的状态变化可能会引发其他的操作或工作状态的变换,那么刚好又可以利用CAG的依赖交替运行,或可选的并行运行,总之是非常灵活和简便的。

Ver: 1.00