Windows Workflow技术

来源:互联网 发布:windows 3d图形编程 编辑:程序博客网 时间:2024/05/05 02:40
 
Windows Workflow技术
 
1     概念... 2
2     Windows Workflow.. 4
2.1      .Net Framework 3.0 简介... 4
2.2      Windows Workflow Foundation简介... 5
3     开发环境搭建... 5
4     Workflow... 6
4.1      WF中流程模型... 6
4.2      关键概念... 6
5     Activity. 8
5.1      什么是Activity. 8
5.2      Activity的其他概念... 9
5.3      Activity分类... 10
6     Activity提高... 13
6.1      通过条件控制工作流... 13
6.2      循环和重复活动... 15
6.3      同步块... 16
6.4      异常处理... 17
6.5      事务... 17
6.6      调用其他代码... 19
6.7      总结... 20
 

 
1       概念
工作流:为了实现组织目标,有关业务活动依时序或逻辑关系相互连接构成业务流程。在业务开展过程中,文档、信息或任务,依据组织规范在参与者之间传递、处理或执行。业务流程中,实现了基于计算机自动化的全部或部分称为工作流。
工作流管理系统(WorkflowManagementSystem,WFMS):是定义、创建、执行工作流的系统。在最高层上,WFMS应能提供以下三个方面的功能支持:
 建造功能:对工作流过程及其组成活动定义和建模;
 运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度;
 运行交互功能:指在工作流运行中,WFMS与用户(业务工作的参与者或控制者)及外部应用程序工具交互的功能。
工作流管理系统的基本结构
WFMS组成如图所示:
在这个一般结构模型中,有三种类型的部件:
 WFMS内提供各种功能支持的软件组元(用深色填充图形表示);
 为一个或多个软件组元使用的各种系统定义和控制数据(未填充图形);
 应用程序和数据库(浅色填充图形)。
系统中主要部件和数据的作用如下:
1.过程定义工具
过程定义工具被用来创建计算机可处理的业务过程描述。它可以是形式化的过程定义语言或对象关系模型,也可以是简单地规定用户间信息传输的一组路由命令。
2.过程定义
过程定义(数据)包含了所有使业务过程能被工作流执行子系统执行的必要信息。这些信息包括起始和终止条件、各个组成活动、活动调度规则、各业务的参与者需要做的工作、相关应用程序和数据的调用信息等。
3.工作流执行子系统(WES)和工作流引擎
工作流执行子系统也称为(业务)过程执行环境,包括一个或多个工作流引擎。工作流引擎是WFMS的核心软件组元。它的功能包括:解释过程定义;创建过程实例并控制其执行;调度各项活动;为用户工作表添加工作项;通过应用程序接口(API)调用应用程序;提供监督和管理功能等。工作流执行子系统可以包括多个工作流引擎,不同工作流引擎通过协作共同执行工作流。
4.工作流控制数据
指被WES和工作流引擎管理的系统数据,例如工作流实例的状态信息、每一活动的状态信息等。
5.工作流相关数据
指与业务过程流相关的数据。WFMS使用这些数据确定工作流实例的状态转移,例如过程调度决策数据、活动间的传输数据等。工作流相关数据既可以被工作流引擎使用,也可以被应用程序调用。
6.工作表和工作表处理程序
工作表列出了与业务过程的参与者相关的一系列工作项,工作表处理程序则对用户和工作表之间的交互进行管理。工作表处理程序完成的功能有:支持用户在工作表中选取一个工作项,重新分配工作项,通报工作项的完成,在工作项被处理的过程中调用相应的应用程序等。
7.应用程序和应用数据
应用程序可以直接被WFMS调用或通过应用程序代理被间接调用。通过应用程序调用,WFMS部分或完全自动地完成一个活动,或者对业务参与者的工作提供支持。与工作流控制数据和相关数据不同,应用数据对应用程序来讲是局部数据,对WFMS的其他部件来说是不可见的。
2       Windows Workflow
2.1    .Net Framework 3.0 简介
从图上我们可以看到3.0是以.Net Framework 2.0为核心,分别对不同技术和应用层面提供的一些模块。我记得一篇文章里面说到.Net Framework 3.0 不应该叫3.0更确切的叫.Net Framework 2.5(哈哈!不知道大家是否赞同这个说法)。
在.Net Framework 3.0包含了四个模块:
WPF(Windows Presentation Foundation):
WPF is a productive, unified approach to UI, Media, and Documents that you can use to deliver unmatched user experiences to your customers.
WPF提供了一个统一UI、媒体和文档的用户体验。
WPF统一了WinForm和Web的用户体验开发。
WCF(Windows Communication Foundation):
Unified framework for rapidly building service-oriented applications
WCF是一个迅速的建立SOA应用的框架。
WCF集成了WebService、Remotting和Com+的一些特征。
WF(Windows Workflow Foundation):
The Programming Model, Engine And Tools For Building Workflow Enabled Applications On Windows Platform.
在Windows平台上提供一个构建工作流程应用的模块、引擎和工具。
CardSpace(Windwos CardSpace):
Technology that simplifies and improves the safety of online login and authentication.
CardSpace是一个提供统一安全管理和身份认证的技术
通过上面简单的介绍,发现在.Net Framework 3.0中一个关键的内容就是统一和集成,微软希望是在.Net Framework 3.0开发时代不需要让开发人员费尽脑筋考虑是选择WinForm还是Web,使用WebService还是Remotting、Com+等等的技术难题,只需要按照.Net Framework 3.0的技术架构开发,就可以做到开发阶段的部署透明化(呵呵!多么美好的未来呀!!!)。
2.2    Windows Workflow Foundation简介
     Windows Workflow Foundation是帮助您在Windows平台上快速建立工作流应用程序的编程模型、引擎和工具,为开发和执行各种基于工作流的应用程序提供了编程框架和工具。
Windows Workflow Foundation 对执行模型进行了活动自动控制方面的虚拟化。这使您能编写可以捕捉各种控制流模式的复合活动,范围包括多种连接和合并、状态机、图形、序列、交叉存取和非本地退出等。总之,它将使您能够通过“高保真”的复合活动对存在于现实世界中的控制流模式进行建模。
     Windows Workflow Foundation是一个帮助你开发基于Windows平台的工作流解决方案的可扩展的框架。作为将来Microsoft WinFX的一部分,Windows Workflow Foundation提供一组API和工具以支持基于工作流的应用程序的开发和执行。Windows Workflow Foundation为创建跨越不同应用程序的端到端解决方法提供了一个简单、统一的模型。
      Windows Workflow Foundation是一个通用的工作流框架。基于Windows Workflow Foundation的解决方案由相互链接的.NET组件构成并运行在宿主程序中。就像你在一个特定的设计环境下创建ASP.NET页面一样,Windows Workflow Foundatio也为你提供了一个良好的设计环境,在可视化设计器中,你可以创建特定的流程、在工作流组件中增加代码、定义商业过程,
      Windows Workflow Foundation提供了工作流引擎、.NET-managed API、运行时服务、与Visual Studio 2005集成的可视化编辑器和调试工具。你可以使用Windows Workflow Foundation创建和执行运行在客户端和服务器端的工作流,并且可以运行在所有的.NET应用程序中。
3       开发环境搭建
.Net Framework 3.0开发环境
操作系统:
最低运行要求为 Windows XP Service Pack 2 (SP2) 或 Windows Server 2003。
开发工具和安装步骤,对仅做wwf,4、5可以不装:
1.                     .Net Framework 2.0(如果安装VS2005可以略过该步骤)
2.                     Visual studio 2005 (可以使用 Express Edition)
3.                     .NET Framework 3.0(WinFX) runtime components。(dotnetfx3setup.exe)
4.                     Windows SDK--1G左右 (6.0.6000.0.0.WindowsSDK_Vista_rtm.DVD.Rel.img)
5.                     vsextwfx.msi(是VS2005开发WPFWCF的插件)
6.                     Visual Studio 2005 Extensions for Windows Workflow Foundation (EN).exe (是一个WF可视开发环境)
4       Workflow模型
工作流需要与主机环境同步 — 通常是 Windows Forms 应用程序或 ASP.NET 应用程序。事件组中的活动能使工作流停止以等待外部事件、处理接收的事件,或只是在执行下一步之前进行等待。最后,Web 服务和状态组将目标锁定在工作流的两种特殊功能 — 将内部引擎为公开为 Web 服务或公开为状态机。
4.1    WF中流程模型
Sequential(顺序)模型
Sequential模型是流程按照事先预定的顺序执行,其中有可能存在分支(IFELSE)、循环(WHILE)等流程。
State Machine(状态机)模型
State Machine模型是以事件(Event)为驱动,使得流程本身转换不同的状态,每个状态有其转变的范围(即都可以转变成那些状态)和驱动事件。
4.2    关键概念
我们还是以一个图来介绍WF的一些关键概念和WF的组成部分。WF包括了Runtime Services(运行时服务)、Runtime Engine(运行时引擎)、Base Activity Library(基础Activity库)。基于此我们要理解如下概念:
l        Workflows are a set of Activities
Workflows是一个Activity的集合
l        Workflows run within a Host Process: any application or server
Workflows需要寄宿在一个进程中,任何的应用或者服务都可以是Workflow的宿主
l        Developers can build their own Custom Activity Libraries
开发人员可以构建自己的Activity类库
l        Base Activity Library
Out-of-box activities and base for custom activities
基础的Activity类库,是自定义Activity的基类
l        Runtime Engine
Workflow execution and state management
负责Workflow的执行和管理的引擎
l        Runtime Services
Hosting flexibility and communication
负责Workflow寄宿和通讯的服务
l        Visual Designer
Graphical and code-based construction
一个图形化的设计器
通过这些概念我们了解到一个Workflow是由多个Activity组成,这些Activity可以WF中预定义的基础Activity也可以是用户自定义的ActivityWorkflow需要有自己的Runtime,这个Runtime负责了Workflow的执行、管理和通讯。
这里有一个非常重要的概念就是Activity。所有的Workflow都是由Activity组成,那么什么是Activity呢?接下来我会向大家介绍。
5       Activity
5.1    什么是Activity
我们可以从两个方面理解Activity
Activities are the building blocks of workflows
Activityworkflow一个已经编译的模块
l        The unit of execution, re-use and composition
是一个可执行的、可重用和可以组合的单元
l        Basic activities are steps within a workflow
基础的ActivityWorkflow的一个步骤
l        Composite activities contains other activities EG: Sequence
复杂的Activity可以包含其他的Activity,例如:Sequence(一个WF预定义的Activity
l        Partners and customers author custom activities EG: “ApproveOrder”
Activity可以是合作伙伴或者客户提供的一个自定义的Activity,这个Activity可能完成一些特定的商业逻辑,例如:“ApproveOrder”
Activities are classes:
l        Properties and events are defined by the activity author and programmable from workflows
可以在Activity中定义属性和事件由workflow使用
l        Has methods that are coded by the activity author but invoked by the workflow runtime (EG: Execute) or designer
Activity中的方法是由Activity的作者实现(如:Execute),由workflow或则设计器进行调用
l        Can be built into workflow assemblies or deployed as re-usable libraries
可以编译在workflow中或则作为可重用库依赖于workflow
下面代码演示了一个Activity的例子:
public partial class SendEmailActivity :
System.Workflow.ComponentModel.Activity
    {
        public SendEmailActivity()
        {
           ............
        }
       
// override Execute with your custom logic
        protected override ActivityExecutionStatus
 Execute(ActivityExecutionContext context)
        {
            // you custom logic
            return ActivityExecutionStatus.Closed;
        }
 
//property
        public string To
        {
            get{........;}
            set{........;}
        }
 
//event
public event EventHandler<CustomActivityEventArgs> Sending
        {
            add{........}
remove{........}
        }
    }
这里面一直在重点强调Activity的是重用,可以说一个Activity的最重要之处就是重用。重用不单单是代码的重用,而是业务逻辑的重用,这也是工作流应用的灵活之处。在开发工作流应用的时候,怎样划分业务逻辑?业务逻辑的颗粒度有多细?WF并没有规定,况且这个问题是仁者见仁,智者见智,并没有一个统一的定论。
个人的理解在定义一个Activity时要做到第一可重用、第二松耦合。在本文中只是对WF的组成和工作原理进行简单的介绍,不会深入讨论业务逻辑的划分和定义,我想即使不使用WF,业务系统也会遇到同样的问题。
5.2    Activity的其他概念
在自定义Activity时还有几个比较重要的概念,分别是DesignerActivityValidatorCodeGeneratorSerializerToolboxItem和定义行为的SupportsTransactionSupportsExceptionHandlers。实际上这些该是ActivityAttribute类,分别制定了Activity在设计器中的UI界面、对Activity在设计期间的完整性校验、Activity的序列化等操作。具体内容我会在后面章节具体介绍,这里只介绍如何使用。
 
[Designer(typeof(CustomActivityDesinger),typeof(IDesigner))]
[ActivityValidator(typeof(SendEmailValidator))]
public partial class SendEmailActivity :
System.Workflow.ComponentModel.Activity
{
......
}
 
public class CustomActivityDesinger : ActivityDesigner
{
......
}
 
public class SendEmailValidator :
System.Workflow.ComponentModel.Compiler.ActivityValidator
{
......
}
5.3    Activity分类
1Control Flow Activity:控制流程类
l        Sequence Activity:顺序流程,使您能够协调一组子活动的连续执行。该序列在最后一个子活动完成之后完成。
l        Parallel Activity并行流程,使您的工作流能够相互独立地执行两个或更多个操作。该活动在继续执行之前会等待这些操作终止。
l        IfElse Activity条件判断流程,使您的工作流能够有条件地执行多个可供选择的分支之一。可在每个分支上放置一个条件,而条件为真的第一个分支将执行。无需在最后一个分支上放置条件,因为它被视为“else”分支。
l        While Activity循环流程,使您的工作流能够在一个条件被满足时执行一个或多个活动。在每次迭代之前,都评估该条件。如果为真,则所有子活动都会执行;否则,该活动完成。可指定声明性条件或代码条件。
l        ConditionedActivityGroup条件组,使您的工作流能够基于特定于每个活动的准则有条件地执行一组子活动,直到针对 CAG 整体满足完成条件。子活动相互独立并可能并行执行。
l        Replicator Activity自我复制。可以在运行中自我复制实例。使您的工作流能够创建给定活动的任意多个实例,并且顺序或同时执行它们。
l        Delay Activity延时执行,使您能够控制工作流的定时以及将延迟内置到工作流。您可以在 Delay 活动上提供超时,以便工作流在恢复执行之前暂停。
l        InvokeMethod使您的工作流能够调用接口上的方法,以便将消息从工作流发送到向 WorkflowRuntime 注册的数据交换服务。
l        Policy使您能够表示或执行规则集合。该活动不在工具箱中;要访问它的功能,必须创建自定义活动并使用派生。
 
2Workflow Lifetime Activity:工作流相关
l        InvokeWorkflow Activity调用执行另外的工作流,使您的工作流能够调用或启动另一个工作流(可达到任意深度)。例如,被调用的工作流可以调用第三个工作流,该工作流又可以调用第四个工作流,等等。递归调用不受支持。受支持的调用模型是发后不理。
l        Suspend Activity暂停当前执行的工作流。挂起工作流的操作,以便能够在发生某个错误条件时进行干预。当工作流实例挂起时,将记录错误。可指定一个消息字符串来帮助管理员诊断发生了什么事情。与当前实例关联的所有状态信息都被保存,并且这些信息会在管理员继续执行时恢复。
l        Terminate Activity中止工作流。使您能够在发生任何异常情况时立即结束工作流的操作。如果是在 Parallel 活动内部调用,则所有分支都被突然终止,而无论它们的当前状态如何。当工作流终止时,会记录错误,并提供一个消息以帮助管理员弄清楚发生了什么事情。
 
3Event Waiting Activity:事件类
l        EventSink在向 WorkflowRuntime 注册的数据交换服务引发指定事件时,使工作流能够从该服务接收数据。
l        EventDriven Activity等待事件驱动。指定要等待处理的事件名,参数等。代表一系列其执行由事件触发的活动。第一个子活动必须能够等待外部事件。可行的首要子活动是 EventSink Delay。在这种情况下,Delay 用作超时。
l        Listen Activity侦听消息。这个可以同时侦听很多消息。一个Listin里面有多个EventDriven。使工作流能够等待(可能存在的)多个事件之一,或者在指定的超时间隔之后停止等待,并且基于结果分支。可向每个分支中添加一个或多个由事件驱动的活动。只有第一个满足条件的分支被执行;其他分支都不会运行。
 
4Transaction and Exception Activity:事务和异常处理类
l        Transaction Context Activity处理事务中的上下文,支持短期、长期的事务。事务上下文是用于对活动进行分组的块。该活动主要用于事务性执行、补偿和异常处理,可以根据情况进行同步。通过同步事务性上下文,可确保对活动中共享数据的任何访问都将正确地序列化。
l        Throw Activity抛出异常。使您能够引发指定类型的异常。使用该活动等效于在用户代码中引发异常的代码处理程序。该活动是引发 .NET 异常的声明性方式。
l        ExceptionHandler异常处理。使您能够处理指定类型的异常。ExceptionHandler 活动是其他活动的包装,在指定的异常发生时,这些活动实际执行所需的任何工作。可根据情况指定一个用于存储异常的本地变量,并且使其可以在代码隐藏中使用。
l        Compensate Activity补偿处理,只能放在Exception中,处理一些回滚处理等。使您能够在发生错误时调用代码来撤消或者补偿已经由工作流执行的操作。通常,对于现在已被取消的操作,您可能希望向先前已经获得成功通知的用户发送电子邮件。
 
5Data-Centic Activity:数据(交换)处理类:用于WF处理空间和Host空间之间的数据交换。
l        UpdateData ActivityWF把数据更新到Host。使您的工作流能够通过在外部数据源对象上定义的方法更新数据存储区。当 UpdateData 活动被触发时,关联的方法将在宿主线程内部执行。
l        SelectData ActivityWF发向Host的请求,使您的工作流能够通过在外部数据源对象上定义的方法查询外部数据。当触发 SelectData 活动时,关联的方法将在宿主线程内部执行。该方法返回的值被传递给工作流。
l        WaitForData Activity使您的工作流能够从外部数据源对象接收信息。当传入的数据修改绑定数据源的状态时,该活动被触发。传入的数据是通过绑定数据源服务接收的。
l        WaitForQuery ActivityHost发向WFWF返回DataSource。使外部应用程序能够在您的工作流中查询数据。该活动将在从宿主收到查询之前一直等待。来自外部应用程序的查询使用绑定数据源服务上的方法提交给工作流。
 
6WebService ActivityWeSerivice的处理
l        InvokeWebService Activity:调用WebService
 使您的工作流能够调用 Web 服务方法。您需要指定要使用的代理类(使用 WSDL),以及您想要调用的方法的名称。同步和异步调用都受到支持。
l        WebServiceReceive Activity使作为 Web 服务本身公开的工作流能够接收 Web 服务请求。
l        WebServiceResponse Activity使作为 Web 服务本身公开的工作流能够响应 Web 服务请求。
 
7The Code Activity:代码处理类
l        Code Activity可写一些代码,您能够向工作流中添加 Microsoft Visual Basic .NET C# 代码以执行自定义操作。但是,这些代码不应该用对 Web 服务等外部资源的依赖性来阻塞工作流。但是我不觉得这样的处理好,因为这样的逻辑有点写死进程序里了。
 
8State Workflow Activity:状态机工作流处理类
l        State表示状态机工作流中的状态。一个工作流必须有个初始状态,有个结束状态。
l        StateInitialization初始状态。我好像没用过这个。在 State 活动中,用作在状态转换时执行的子活动的容器。
l        SetState设置下一个状态。使您的状态机工作流能够指定向新状态的转换。
 
9Custom Activity:用户自定义状态。
6       Activity提高
6.1    通过条件控制工作流
如果在工作流中指定了条件,运行时引擎将对条件进行计算,然后根据计算结果进行操作。两种基于条件的核心活动是 IfElse 和 Policy。IfElse 活动的执行方式如同高级编程语言中的一条典型的 If 语句。它可以包含任意多基于条件的分支,以及一个在其他条件不满足情况下执行的默认分支。而 Policy 活动表示一系列规则。在 Windows Workflow Foundation 中,一条规则包括一个条件以及一个或一个以上引发的操作。可以将规则看作 If-Then-Else 语句,其中条件对应 If 块的 Boolean 临界条件,操作定义了 Then 和 Else 子句。让我们进一步了解各个活动,然后对它们进行比较。
当被添加到一个工作流中时,IfElse 活动看起如图 3 所示。默认情况下,它有两个分支,可以通过右键单击并从上下文菜单中进行选择来添加新的分支。当运行时引擎达到一个 IfElse 活动,它开始计算从左至右进行的各分支的条件。各分支的条件被确定,第一个计算结果为“true”的分支被运行。您可以通过活动的上下文菜单中的命令来回移动分支以更改分支的计算顺序。要启用分支,需要指定有效的条件。您可以采用以下两种方法中的一种来指定条件:通过表达式或通过一段代码。
图 3 IfElse 的实际活动(Click the image for a larger view)
如果您选择使用表达式来指定条件,则要在设计器设置分支,并为 Visual Studio 2005 的“属性”框中的“条件”项提供一个公共存放位置。接下来,打开表达式编辑器,输入一个涉及工作流成员并且其计算值为布尔值的表达式。例如,如果工作流类具有名为 MinimumLength 的公共属性,您可以将条件设置如下:
this.MinimumLength >= 8
条件表达式编辑器完全支持代码完成并提供对工作流私有成员和公共成员的访问。这意味着您也可以调用 Boolean 函数。
当您试图读取 MinimumLength 的值时,运行时会结束调用属性的 get 存取器。该存取器能够回复私有成员 _minLength 的值。IfElse 活动中的最后分支可以没有条件。在这种情况下,它将作为 IF 工作流语句的 Else 分支。
指定条件的第二种方法是通过临时代码。在这种情况下,您可以为工作流类添加方法,例如:
private void EvalCondition(object sender, ConditionalEventArgs e)
{
e.Result = ….
}
该函数必须与接受对象和 ConditionalEventArgs 类并回复 void 的签名相匹配。ConditionalEventArgs 类的 Result 成员将设置为布尔值,代表条件的计算结果。
IfElse 活动可以进行嵌套以表示复杂的逻辑,但逻辑的设计仍然要在工作流中进行硬编码。这种方法既有利也有弊。有利的一面在于它使您可以根据您的需求准确设计工作流并将其与其他活动整合。当您需要创建一组规则来初始化部分工作流状态时,其不利的一面就显现出来。让一连串 IfElse 活动仅仅为工作流的内部成员分配值显然有些矫枉过正。
当您真正需要控制工作流的流动并连接各种工作块时,您应该使用 IfElse 活动组合。如果您所需要的仅仅是一个编程 If 语句序列,带有附加到分支的简单代码,那么最好使用 Policy 活动。Policy 活动是一个规则集合。与各规则相关的代码仅限于设置工作流属性,调用工作流方法或针对引用的程序集中的类型的静态方法。
活动与已排序的规则集合相关联,您可以通过编辑器定义规则。每条规则都有优先级和 Active 属性。这两种属性的组合确定了是否应当评估规则,以及采用哪种优先级。另外,规则还必须指定重估行为 —“Always(始终)”(默认值)或“Never(从不)”。如果设置为“Always”,规则将根据需要进行重估,否则只进行首次评估,以后无论工作流状态如何变化,也不再更改。
然而,作为一个整体设置的规则要进行正向推理。简而言之,正向推理是指一个规则的操作导致其他相关规则被重估的能力。例如,对另一个规则测试的字段的值进行更新操作需要对所涉及的规则进行重估(除非对该规则的重估被禁用)。正向推理有三种类型。 隐式推理表示运行时引擎将判断哪些字段被一些操作修改了,然后自动对它们进行重估。只要操作显式地作用于属性,这种机制即可成功。如果有如下操作,情况又会怎样:
IF this.MinimumLength <= 8 THEN RefreshInternalState()
有谁能够知道 RefreshInternalState 方法将要做什么?该方法可能会触及涉及策略活动中其他规则的工作流属性。通过使用方法声明中的属性,您可以显式地表示该方法的行为:
<RuleWrite("PasswordLevel")> _
Public Sub RefreshInternalState()
 Me.PasswordLevel = 1
End Sub
RuleWrite 属性表示方法将要修改指定的属性;同样,RuleRead 属性表示方法将要从指定的属性中进行读取。这样,就可以为运行时引擎提供明确清晰的信息以确保规则设置同步。
最后,您可以编写显式调用对涉及的属性进行更新的操作。例如:
IF this.MinimumLength <= 8 THEN
RefreshInternalState()
Update("PasswordLevel")
规则操作中的 Update 方法会计划对包含指定属性的所有规则进行重估。
6.2    循环和重复活动
这组活动提供了典型的 While 活动以及 Replicator 活动,这些活动与典型的 For 循环有些共同点。While 活动接受条件并在每次迭代开始时对该条件进行计算。如果条件为“true”,该活动将运行指定的子活动并重复直至条件为“false”。请注意在 While 主体内允许进行单一活动。因此,您可能要使用一个复合活动(如 Sequence 或 Parallel)在循环中执行多个活动。(在此处,使用术语“交错”可能比“并行”更加准确。因为没有涉及 Parallel 活动的并发,只有同一线程内的交错。) 与 Foreach 语句类似,Replicator 活动创建并执行指定的子活动的给定数量的实例。您可以只指定一个子活动,但允许使用复合或自定义活动。您不能通过声明性属性来控制迭代数。但是,您可以为初始化事件编写一个处理程序,并针对各个需要的实例,使用初始化数据填充 CurrentChildData 集合:
Sub replicator1_Initialized(ByVal sender As Object, ByVal e As EventArgs)
 Console.WriteLine("Initializing ...")
 replicator1.CurrentChildData.Add("You are #1")
 replicator1.CurrentChildData.Add("You are #2")
 replicator1.CurrentChildData.Add("You are #3")
End Sub
前面所述的代码段规定了 Replicator 的子活动的三个实例的顺序,每个实例均使用给定的字符串进行初始化。请注意,如果您将 CurrentChildData 集合置为空,Replicator 将不运行任何子活动,并仅限于触发顶级事件,如 Initialized 事件和 Completed 事件。您可以使用对象(不一定是字符串)初始化子活动,包括自定义类的实例。Replicator 还包括标示各个子活动初始化和完成的事件。默认情况下,子实例按顺序运行,尽管通过设置 ExecutionType 属性,您可以选择并行执行。如果需要并行执行,在复制器开始并执行并行线程前,可以创建所有子活动实例。当以顺序模式执行时,只有当前一个活动结束时下一个活动才能被实例化。 如果没有通过 UntilCondition 属性设置全局条件,Replicator 将在所有复制完成后才结束,否则,将在 UntilCondition 为“true”时终止活动。值得注意的是,尽管在所有子活动已完成并且 UntilCondition 属性计算为“false”时活动将被挂起,Replicator 也从不通过类似 While 循环中的子活动进行循环。在对活动进行全局实例化后,在每个子活动完成后以及所有包括的活动都已完成后,将对 UntilCondition 进行计算。但是有时,如果条件计算为“true”,Replicator 将立即退出。
您可以将 ConditionedActivityGroup (CAG) 活动中的条件执行和循环混合在一起。CAG 包含一些子活动(可能是复合活动),并可运行这些活动,直至满足全局条件。基本上,CAG 组合了 While 和 IfElse 活动的行为。通过以下伪代码来表示内部逻辑:
While condition
 If child1.WhenCondition Then child1.Execute
 If child2.WhenCondition Then child2.Execute
 :
 If childN.WhenCondition Then childN.Execute
End While
每个子活动都有 WhenCondition 属性。根据对指定条件的计算,可以在当前的迭代中运行或跳过活动。请注意,如果子活动没有 WhenCondition 集合,子活动将只能在第一次被执行,并在后续的迭代中被跳过。如果需要,可以根据状态变化的依存关系对所有条件进行计算。
在 UntilCondition 返回“true”并立即取消所有当前正在执行的活动后,CAG 活动将终止。如果没有指定条件,当因为没有设置条件或者条件计算为“false”而没有子活动运行时,CAG 也将结束。
6.3    同步块
涉及交错活动的顺序工作流都会对共享成员的访问进行系列化。然而,操作是不同的。当两个或两个以上以交错方式运行的序列用到 Parallel 活动时,操作是不同的。请看一下图 5。While 活动包含两个序列块,然后,序列块又将 Parallel 活动和代码活动联系在一起。在内部,Parallel 活动有四个块,每个块都对定义为工作流类成员的数字执行数学运算。Parallel 活动的四个分支以交错方式执行。(每一次在工作流实例中只有一个线程。该线程在 Parallel 活动的分支间来回切换。)跨任务同步又如何呢?默认情况下,子活动内部运行的每一段代码都进行对共享成员的直接访问。
图 5 平行任务(Click the image for a larger view) 
根据图 5 所示的简单架构,可能会出现每个分支都作为一个原子操作来运行的情况。这纯属巧合,运行严格依据各操作的复杂性和持续时间。如果每个分支由多个活动组成,情况会怎样?SynchronizationScope 提供了声明性和明确的同步存取建模方法,它可以实现对一组活动中一个给定工作流实例内的共享状态进行同步存取。
SynchronizationScope 活动内运行的工作流部分是一种不能中断的原子操作。此处没有事务语义,SynchronizationScope 活动中包含的操作不能回滚。在所有基于活动(这些活动具有并行执行路径,如 Parallel、Replicator 和 CAG)的解决方案中,SynchronizationScope 活动起着关键作用。
图 6 可以帮助您快速体验 SynchronizationScope 活动的作用,该图是图 5 中工作流的修改版本。blockMultiply 活动对延迟交错的两个代码块进行计数。blockDivide 活动包含一个未同步的代码块。如果您将 blockMultiply 的内容放到同步范围之外,blockDivide 将可能在 blockMultiply 的延迟阶段执行。根据要进行的更新的种类不同,这可能会成为一个严重问题。SynchronizationScope 活动可确保工作流部分的连续性。
图 6 平行任务与同步范围(Click the image for a smaller view) 
6.4    异常处理
正如其他基于 .NET 的应用程序一样,工作流能够引发和捕获异常。特别是,您可以使用 Throw 活动来引发一个特定的异常。Throw 活动需要几个设置 — 要引发的异常的类型,存储异常对象实例以进行进一步自定义的工作流类成员。只要在工作流项目中引用了类型,您就可以使用自定义的异常类型。
要捕获工作流活动引发的异常,您要添加 FaultHandler 活动。工作流设计器提供了一个用于您添加的错误处理程序的容器。每个处理程序一定是某个工作流的一部分,一旦捕获异常,该程序即执行。添加 FaultHandler 活动后,您可以定义要捕获的异常的类型。您可以通过 Fault 属性访问异常对象。值得注意的是,要可视化错误处理程序,您必须在 Visual Studio 2005 设计器中切换视图并通过单击设计器视图底部的选项卡列表来选择“View Faults(查看错误)”选项卡。
6.5    事务
.NET Framework 2.0 包括一个轻松而有效处理事务的对象 — 无论参与对象的数目和类型以及范围如何,也无论事务是本地的还是分布式的。该对象被命名为 TransactionScope,一般情况下,您可以根据如下模式进行使用:
Using ts As New TransactionScope
 ...
 ts.Complete
End Using
TransactionScope 对象保证在出现故障的情况下,事务既可以被提交也可以被回滚,更为重要的是,它可以确定您需要一个本地事务还是一个分布式事务,并登记所有必要的资源。当代码到达一个无法本地运行的点时,相应地,TransactionScope 提升至分布式事务处理协调器 (DTC)。实施 ITransaction 接口的所有对象可以随一个事务一起登记。该列表包括所有标准 ADO.NET 2.0 数据提供程序,并且 Microsoft 消息队列以兼容模式工作。
值得注意的是对于分布式事务,TransactionScope 和企业服务之间存在一些差别。TransactionScope 属于专门针对基于 .NET 的应用程序而设计的事务框架 — System.Transactions。在内部,System.Transactions 命名空间的类有时会以为 DTC 和 COM+ 委派一些工作作为结束。为什么在这一点上 TransactionScope 至关重要?TransactionScope Windows Workflow Foundation 活动仅仅是 TransactionScope .NET 类实例的一个工作流包装程序。
当您为工作流添加 TransactionScope 活动时,您可以设置要完成的事务的超时时间,并设置所需的隔离级别。事务范围内组合的所有活动形成了能够实现典型 ACID 架构的工作单位。在所有子活动都成功完成后将提交事务,工作流继续进行到下一步。如果在范围内引发异常,TransactionScope 活动自动回滚。编写事务性工作流并不要求您显式地处理提交和回滚语义 — 如果您要提交事务和引发异常来中止事务,您只需顺其自然。该活动将可以轻松管理其他任何事情。
请注意,您不能嵌套两个或两个以上的 TransactionScope 活动。同样地,您不能使用 Suspend 活动挂起事务内的工作流。然而,您可以通过 Listen 或 EventHandlingScope 活动,将事件处理程序整合到事务中。在这种情况下,工作流主机应当包括持久性服务,否则,如果工作流试图将它的状态保存为空闲状态,会引发异常。 此外,相关的活动,如 CompensatableTransactionScope 还支持补偿。补偿是在有后续业务预期的情况下,从逻辑上撤消已完成的事务的过程。补偿与回滚不同,因为它是一种当工作流中发生违反规则的情况时,取消已成功完成和提交的事务所产生的影响的有效方法。在两个帐户间进行资金划转的事务是一个典型的回滚示例。第一个调用将资金从一个帐户中取出,第二个调用将相同数额的资金划转至另一个帐户。只要数据库支持两阶段提交模型,如果在事务中引发异常,回滚可恢复一致的状态。
设想一下一个订单处理工作流,其中一个事务被用于通过信用卡进行支付。第一步,首先从信用卡中提取资金来支付货款。然后,在交易成功完成后,该货物不能再被销售。如果违反了业务规则,需要按照合适的规定对交易结果进行补偿 — 一般是将资金划入签帐卡。
通过右键单击 CompensatableTransactionScope 活动,您可以切换到事务的“补偿”视图并添加所有补偿事务影响所需的活动。在图 7 中,OrderScope 事务与补偿活动规定相关联,该规定要求在出现业务异常的情况下,应将已提取的资金退回。正如我前面谈到的,工作流中的异常是通过异常处理程序捕获的。对于某一特定异常(如 ProductDiscontinued),您可以调用一个 Compensate 活动,该活动已绑定到其影响作用已被取消的事务活动。一般情况下,Compensate 活动会触发适用于任何可被补偿的活动(即,适用于实施 ICompensatableActivity 接口的活动)的补偿机制。与 CompensatableTransactionScope 一起,CompensatableSequence 也实施了本接口并能够用于非事务性的补偿情况。不过,您也可以编写支持补偿的自定义活动。
图 7 事务与补偿活动(Click the image for a larger view)  
6.6    调用其他代码
此外,还有一些活动可调用和执行代码。这些活动包括:Code、InvokeWorkflow、InvokeWebService 和 CallExternalMethod。Code 活动最灵活,可以表示您在工作流某一点插入的自定义代码块。Code 活动触发您在工作流中处理的 ExecuteCode 事件,并能使其运行您所需要的代码。代码将包含在工作流中并与其一起进行编译。Code 活动可以调用外部程序集,只要您在 ExecuteCode 事件处理程序中加入所有能够加载程序集和选择方法的必要代码。
InvokeWorkflow 活动可以引用工作流和异步调用工作流。您可以传递输入参数,但要注意 InvokeWorkflow 活动要在被启动的工作流开始执行之前完成。您无法将当前工作流的执行与外部工作流的执行同步,也不能处理当前工作流中的输出参数。
InvokeWebService 活动可以通过代理类同步调用 Web 服务方法。使用 Code 活动并调用 Web 服务,可以对活动的行为进行模拟。
最后,CallExternalMethod 活动可用于调用本地服务方法。本地服务是对于实施以 ExternalDataExchange 属性修饰的接口的工作流可用的任何类。另外,代表本地服务的类必须作为外部数据交换服务添加到工作流运行时。
Dim service As New ExternalDataExchangeService
runtime.AddService(service)
Dim localService As New YourService()
service.AddService(localService)
您可以配置 CallExternalMethod 活动以调用由本地服务实施的接口的方法。为什么 CallExternalMethod 仅限于调用已知接口的方法?原因在于活动不仅仅是代码执行者,而是旨在与 HandleExternalEvent 活动一起实施与本地服务的双向交流。借助 CallExternalMethod 活动,通过将 HandleExternalEvent 活动加入工作流,您可以调用服务方法,处理服务引发的事件。
6.7    总结
活动是工作流的构造块。通过在 Visual Studio 2005 设计器中撰写活动,您可以创建工作流解决方案。与 ASP.NET 中的服务器控件和 Windows Forms 中的控件类似,工作流活动是解决方案的精华所在并形成了开发人员的主要工具箱。Windows Workflow Foundation 提供了一些随机活动。在此,我要回顾一下涵盖事务、并行和条件执行、循环以及异常处理的活动。wf.netfx3.com 上提供了更丰富的信息。
 
原创粉丝点击