workflow标准活动

来源:互联网 发布:mac微信接收的文件 编辑:程序博客网 时间:2024/04/30 23:33

在WF中,工作流分为两种类型,序列式(Sequential)和状态机(State Machine)。

 

序列式工作流将一系列待执行的呃步骤以一种预先描述好的次序描述出来。在这种工作流里,控制流程的是我们很熟悉的诸如if-else和while循环结构。序列式工作流的行为可以用简单的流程图来演示。以一个取款机取款的例子来看。

 

 

每一个步骤都是很清楚地定义好的。这个工作流有着确定的起点与终点,我们不能随意跳转到中间的某个点上,唯一能做的只有从头开始。

 

状态机工作流则并不定义固定的流程,它们定义一组状态,包括状态之间可能存在的转移。同样是取款机取款,我们看看它的状态机描述。

 

 

方框中的不再代表独立的步骤,而是代表状态。每个状态可以转移到一个或多个其它状态上去。执行这样的工作流不一定要从第一个状态开始。这就允许工作流被打断,然后根据需要恢复。在WF中,状态的转移是通过宿主应用程序引起的外部事件触发的,这就意味着工作流的控制完全是交由外界完成的。

 

 

具体在设计时该选择哪一种工作流是一个很重要的问题。一般来说,判断的依据就在于控制工作流走向的重要选择是发生在工作流的内部还是外部,是否由用户进行控制。序列工作流在本质上是对工作流的路径建模,将路径信息都编码到了模型之中,因此适合于前一种情况;在某些时候,我们并不关心工作流的路径,我们只关心当前的工作流状态,并且有哪些可能的选择会跳转到某个另外的状态,这就是后一种情况,应该采用状态机工作流。


if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 33800; var cb_entryId = 1080991; var cb_blogApp = "viki117"; var cb_blogUserGuid = "992d420b-63cf-dd11-9e4d-001cf0cd104b"; var cb_entryCreatedDate = '2008/2/25 16:53:00';

 

概要性地讨论一下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

是一个用来清除与复合活动联系的容器(抱歉我也没看懂 -。-)

 

标准活动就介绍至此。后续的短文中会穿插介绍自定义活动的开发。

if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 33800; var cb_entryId = 1081014; var cb_blogApp = "viki117"; var cb_blogUserGuid = "992d420b-63cf-dd11-9e4d-001cf0cd104b"; var cb_entryCreatedDate = '2008/2/25 17:09:00';

0 0