通过条件控制工作流
如果在工作流中指定了条件,运行时引擎将对条件进行计算,然后根据计算结果进行操作。两种基于条件的核心活动是 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”,规则将根据需要进行重估,否则只进行首次评估,以后无论工作流状态如何变化,也不再更改。
本新闻共
6页,当前在第
2页
1 2 3 4 5 6