一、WF活动概述:WF活动的顶层类的关系:
活动条件类型:
代码条件:
规则条件:关联.rules文件。
二、简单概述WF的基本活动:
IFElseActivity活动:在工作流中做一些分支决定。每个分支用一个IfElseBranchActivity表示。
WhileActivity活动:当需要重复执行子活动,直到条件满足进行退出时,可以使用WhileActivity活动
ParalleActivity活动:可以包含两个或多个SequenceActivity活动,也只有sequenceActivity活动才可以成为ParallelActivity的子活动。他并不是同时执行多个分支,每个工作流实例执行在单一的线程上,因此并行执行多个活动部可能。并不能保证sequenceActivity执行活动的顺序。
使用ReplicatorActivity活动:可以模拟C#的Foreach语句,改活动创建和执行单一活动的多个备份。ReplicatorActivity中的子活动被认为是一个被创建的子活动实例的一个模板。在Activity的InitialChildData属性内,被传递一个种子的数据集合来处理。InitialChildData的属性是一个IList的集合。当ReplicatorActivity执行时,会对位于InitialChildData活动中的每个元素从活动模板中克隆并执行。ReplicatorActivity支持不同模式的操作,可以设置ExecutionType属性来进行设置,分别是Sequential或Parallel,指示复制子活动的实例是以并行方式还是顺序方式执行。
使用ConditionedActivityGroup活动是一个组合活动,允许构建相对复制的工作流。该活动实际上具有一些ParallelActivity和whileActivity行为,属于一种混合活动类型。接受一个或多个希望执行的子活动。子活动从左向右执行,将只有一个子活动被执行。每个子活动定义一个WhenCondition条件,决定活动是否应该被执行。如果定义了子活动的结果为True,则下一次序改子活动被执行一次,并且子活动持续执行直到WhenCondition的值为false。如果子活动的WhenCondition没有被定义,则子活动仅执行一次。
使用InvokeWorkflowActivity活动允许当前工作流执行一个新的工作流作为其步骤。InvokeWorkflowActivity要求工作流运行时使用当前附加到该运行时的计划程序创建新的工作流。所调用的工作流只能接受输入参数。不支持工作流完成后获取输出参数。
- 使用TerminateActivity活动和SubspendActivity活动:TeminiateActivity被用于声明性的终止当前工作流,当工作流终止时,触发WorkflowTerminated事件。SubspendActivity活动,挂起当前工作流,此时WorkflowSuspended事件被触发。
-
二、本地服务和事件驱动的活动:WF中的服务可分为核心服务和本地服务。核心服务由WF定义,而本地服务由开发人员定义。本地服务大都用于工作流和宿主之间进行通信。
- 工作流主要在以下方面和本地服务进行交互:
调用本地服务的一个方法;
等待本地服务引发一个事件;
步骤:定义一个服务契约;为接口应用ExternalDataExchangeAttribute特性;定义继承接口的类;创建一个服务实现类的实例,并添加到工作流运行时引擎,
- 使用本地服务在宿主和工作流之间通信:以投票为例来演示。这次将会弹出一个确认框来让用户选择,根据选择继续工作流。
首先考虑宿主传递一个用户的别名到工作流中。当工作流提示用户投票时,需要这个别名。为了在宿主和工作流之间传递参数。定义一个ExternalDataEventArgs派生参数类:代码:
然后工作流需要知道用户选择了什么,需要定义两个事件,让工作流触发外部事件,当批核后,触发批核事件,批核工作流得以执行。反之执行拒绝工作流。
ApprovedProposal和RejectProposal类似于两个信号,通知工作流执行,工作流将使用HandleExternalEventActivity来处理外部事件。
定义类实现接口:
工作流设计:添加一个CallExternalMothodActivity来调用CreateBallot方法;添加一个ListenActivity,等待多个事件中的任何一个事件发生。在该活动中
添加2个HandleExternalEventActivity,分别监听ApprovedProposal和RejectProposal。
当工作流批核或拒绝后,同时响应两个活动的Invoked事件。
最后注册服务。
- 事件驱动活动简介:一些活动是组合活动,这种类型的活动作为其他事件处理活动的容器,比如EventDrivenActivity。ListenActivity。
- 使用EventHandlingScopeActivity活动:定义一个完全不同事件的处理活动,它具有2个分离的区域:主要子活动和一套事件处理活动。除了子活动,事件处理活动被包含在一个或多个EventHandlersActivity内部,作为EventHandlingScopeActivity的子活动。EventHandlingScopeActivity会将其主子活动与EventHandlersActivity活动并行执行。