您现在的位置: 星云电脑教程 >> 电脑教程 >> 经验共享 >> 实用技巧 >> 正文

Windows工作流活动技术概览

星云电脑教程 文章来源:msdn 作者:佚名 更新时间:2007-3-10 12:06:47 点击数有问必答

 

图2

控制流活动管理图形活动执行的顺序。列表列出了实现循环的条件块以及构造。执行活动包括多种构造,这些构造可终止或挂起工作流、引发异常、执行内部或外部代码,或者生成另一个工作流。多数工作流需要与主机环境同步 — 通常是 windows Forms 应用程序或 ASP.NET 应用程序。事件组中的活动能使工作流停止以等待外部事件、处理接收的事件,或只是在执行下一步之前进行等待。最后,Web 服务和状态组将目标锁定在工作流的两种特殊功能 — 将内部引擎为公开为 Web 服务或公开为状态机。让我们检查一下框架中的主要活动,然后分组进行。

通过条件控制工作流

如果在工作流中指定了条件,运行时引擎将对条件进行计算,然后根据计算结果进行操作。两种基于条件的核心活动是 IfElse 和 Policy。IfElse 活动的执行方式如同高级编程语言中的一条典型的 If 语句。它可以包含任意多基于条件的分支,以及一个在其他条件不满足情况下执行的默认分支。而 Policy 活动表示一系列规则。在 windows Workflow Foundation 中,一条规则包括一个条件以及一个或一个以上引发的操作。可以将规则看作 If-Then-Else 语句,其中条件对应 If 块的 Boolean 临界条件,操作定义了 Then 和 Else 子句。让我们进一步了解各个活动,然后对它们进行比较。

当被添加到一个工作流中时,IfElse 活动看起如图 3 所示。默认情况下,它有两个分支,可以通过右键单击并从上下文菜单中进行选择来添加新的分支。当运行时引擎达到一个 IfElse 活动,它开始计算从左至右进行的各分支的条件。各分支的条件被确定,第一个计算结果为“true”的分支被运行。您可以通过活动的上下文菜单中的命令来回移动分支以更改分支的计算顺序。要启用分支,需要指定有效的条件。您可以采用以下两种方法中的一种来指定条件:通过表达式或通过一段代码。

图 3IfElse 的实际活动(Click the image for a larger view)

如果您选择使用表达式来指定条件,则要在设计器设置分支,并为 Visual Studio 2005 的“属性”框中的“条件”项提供一个公共存放位置。接下来,打开表达式编辑器,输入一个涉及工作流成员并且其计算值为布尔值的表达式。例如,如果工作流类具有名为 MinimumLength 的公共属性,您可以将条件设置如下:

this.MinimumLength >= 8

图 4 所示的编辑器完全支持 IntelliSense? 并提供对工作流私有成员和公共成员的访问。这意味着您也可以调用 Boolean 函数。假设您有一个属性声明如下:

Public Property MinimumLength() As Integer

Get

Return _minLength

End Get

Set(ByVal value As Integer)

_minLength = value

End Set

End Property

图 4针对IfElse 活动的Condition Editor(Click the image for a larger view)

当您试图读取 MinimumLength 的值时,运行时会结束调用属性的 get 存取器。该存取器能够回复私有成员 _minLength 的值。IfElse 活动中的最后分支可以没有条件。在这种情况下,它将作为 IF 工作流语句的 Else 分支。

指定条件的第二种方法是通过临时代码。在这种情况下,您可以为工作流类添加方法,例如:

Sub EvalCondition(ByVal sender As Object, ByVal e As ConditionalEventArgs)

e.Result = ... ' Boolean value

End Sub

该函数必须与接受对象和 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 方法会计划对包含指定属性的所有规则进行重估。

上一页  [1] [2] 

>>