概要性地讨论一下WF工作流的基石——活动。活动是离散的、可复用的组件,它被设计来实现特定的功能。WF包括了一组标准的活动,可以在我们的工作流中起到杠杆的作用。我们自己也可以自定义一些活动,来解决特定的业务问题。
抛开活动的来源(标准的或自定义的),我们在设计时使用它们的经历是相同的。我们将一个活动拖放到工作流中,然后在Visual Studio的属性窗口中设置它们的属性,控制它们运行时的行为。
一个能够寄宿其它活动的活动(真绕口L)被称作复合活动(composite activity)。没有这种能力的活动就称为简单活动(simple activity)。有些活动还允许我们向工作流类中添加代码,比如CodeActivity,如果我们不给它设置ExecuteCode,那么编译是不会进行的。
标准活动(Standard Activities)
让我们来看一看WF提供的标准活动。这里并不是要介绍每一种活动的详细用法,而是走马观花地进行一番概览。为了表述方便,将所有的活动分类介绍
l Custom Workflow Logic
特指CodeActivity。利用它我们可以直接向工作流添加我们自己的业务逻辑。将CodeActivity添加到工作流后,我们就得到了一个处理ExecuteCode事件的句柄,并可以向其添加代码。
l Flow Control
顾名思义,控制工作流中数据流向的活动。包含了一些我们非常熟悉的编程结构,比如分支和循环。同时还有诸如并行、延时、中断、挂起等活动,它们以自己的方式来控制整个流程的进行。
n IfElseActivity和IfElseBranchActivity
这个我们在前面的Calculator中已经看到了。利用它可以构建多选条件分支。这是一个复合活动,包含有两个或更多的IfElseBranchActivity,在运行时,只有一个确定的分支会被执行。
IfElseBranchActivity包含了一个我们自己定义的条件,如同前面指出的,这个条件可以是代码形式定义的,也可以是规则定义的。一旦条件被评定为“真”,那么该条分支中包含的子活动就会被执行,其它分支就被华丽的54掉;评定为“假”的时候,它的下一条分支的条件将被评定。最终的分支不需要定义条件,只要前面的分支条件都不满足,它就会被视为if-elseif-else组合中的最后一个“else”。
n WhileActivity
当条件为真的时候,循环执行它的子活动。同样的,它的条件可以是代码形式也可以是规则形式。该条件是在进入子模块之前就判断的,也就是说初始条件若为false,那么它内部包含的活动不会被执行。
n DelayActivity
暂时中止工作流的执行一段时间。常被用来设定一段延时,等待外部事件。
n SequenceActivity
一个能够允许我们添加多个顺序执行的自活动的复合活动。可以看做是WPF中的“容器”,有些只能接受一个子活动的活动比如ReplicatorActivity、WhileActivity和ParallelActivity,可以用这种方法来添加“多个”子活动。
n ParallelActivity
允许我们计划两个或更多的子分支同时执行。
n ReplicatorActivity
此活动创建并执行单个子活动的多个副本。在运行时,它可以基于数据集的对象数目来创建子活动的多个实例。有了这个东东,开发者就可以采用数据驱动的数据流(data-driven workflow),其特点是子活动实例的数量只有在运行时才能确定。从这一点上说,它很像C#中的foreach语句。
n ConditionedActivityGroup
简称CAG,用来有条件地执行一系列子活动。每一个子活动都与一个WhenCondition进行关联,凡是满足WhenCondition的子活动都会被执行,而非if-else那样只能执行其一。
n InvokeWorkflowActivity
用来启动第二个工作流。第二个工作流是异步执行的,所以这个活动会在新工作流完成之前返回。
n SuspendActivity
停止当前工作流的执行,但并不是永久中断。常用在工作流出错但这个错误又是可以恢复的地方,工作流可以从断点重新启动。
n TerminateActivity
立即停止工作流实例的执行,并且是“终结”,不能再次恢复。
l Statement Management
这一类活动都是在状态机工作流中使用的。包括的活动被用来定义、初始化和完成一个状态,或是转移到另一个状态。
n StateActivity
代表一个单一的状态,也是状态机工作流的基础。StateActivity通常被添加进状态机工作流的顶级,但也可以塞进另一个StateActivity里。
n SetStateActivity
被用作转移状态。通过设置TargetStateName属性来指定新的状态。
n StateInitializationActivity
这是一个可选的活动,包含有当首次进入到一个状态时要执行的活动。一个StateActivity里最多只能定义一个。
n StateFinalizationActivity
与上面那个活动相反,它定义的是离开某个状态之前需要执行的业务。
l Event Handling
这一类活动与事件句柄相关,并且需要与接收这些事件的子活动一起工作。这里提到的活动本身并不实际接收这些事件,它们只是另一些事件驱动(event-driven)活动的容器。下面提到的活动解释都比较复杂,我暂时也搞不清楚,在这里仅仅列出名称,详情还请参阅MSDN。
n ListenActivity和EventDrivenActivity
n EventHandlersActivity和EventHandlingScopeActivity
l Local Service Communication
用来在一个工作流和一个本地服务之间进行通讯。
n CallExternalMethodActivity
n HandleExternalEventActivity
l Rules
一类用于联系工作流规则引擎的活动。特指PolicyActivity,可以允许我们定义一组规则,作用于工作流的字段或属性之上。
l Web Services
这一类活动使得我们的工作流可以与web服务进行交互。
n InvokeWebServiceActivity
n WebServiceInputActivity
n WebServiceOutputActivity
n WebServiceFaultActivity
l Transactions, Compensation与Synchronization
这一类活动可以是我们能够定义一个包括了多个活动的工作单元。同时也包括对变量的同步访问。Compensation的功能是对已经成功执行的行动进行undo。
n TransactionScopeActivity
n CompensatableTransactionScopeActivity和CompensatableSequenceActivity
n CompensateActivity和CompensationHandlerActivity
n SynchronizationScopeActivity
l Exceptions和Error Handling
这些活动与.NET异常协同工作。
n ThrowActivity
可以作为一个工作流步骤抛出一个.NET异常。与使用C#代码throw异常的结果是一样的。
n FaultHandlerActivity和FaultHandlersActivity
这两个活动用来捕捉和处理工作流内部的.NET异常。后者包含了前者对象的集合,是一个复合活动。
n CancellationHandlerActivity
是一个用来清除与复合活动联系的容器(抱歉我也没看懂 -。-)
标准活动就介绍至此。后续的短文中会穿插介绍自定义活动的开发。