组织并执行一系列的操作或者活动的最自然的方式——
那就是工作流——
同时也是构造一个工作流程的可执行表现形式的最佳途径。
Windows Workflow Foundation(
以下简称WWF)
提供了一个编程框架和工具以开发和执行各种不同的基于工作流的应用程序,比如文档管理、线型的商业应用、贸易单据流程、IT
管理、B2B
应用以及消费者应用。
有状态的、持久化的、不间断运行的应用程序
WWF 简化了创造有状态的,不间断运行的异步工作流应用程序的过程。WWF 运行时引擎管理工作流的运行,为工作流的长期运行提供保障,并能抵抗机器的重启。WWF 运行时服务提供了一系列的附加功能,例如WWF 服务为能温和且正确的处理错误提供了事务和持久化。
工作流模型
WWF 为开发人员提供了一个工作流模型,来描述应用程序所需要的处理过程。通过使用工作流模型所提供的流程控件、状态管理、事务和同步器,开发人员可以分离应用程序逻辑和业务逻辑,构造一个高层次的抽象,达到提高开发者效率的目的。
组件的重用
WWF
为开发者提供了一系列的活动
——活动是一种包含了工作单元的可配置逻辑结构。这种结构封装了开发者可能经常性用到的一些部件,这样就节省了开发者的时间。
如果遇到一些特殊的需求或场景,WWF
同样为开发自定义的活动提供了简单的方法。
通过将工作流引擎载入进程,WWF
可以使任何应用程序和服务容器运行工作流。
运行时服务组件被设计成可插件形式的,这个可使应用程序以最合适的方式来提供它们的服务。WWF
还提供了一组运行时服务的默认实现,这些服务能满足大部分类型的应用程序。
另外,WWF
还提供了对ASP.NET
的out-of-the-box
(啥意思?)支持,让构造和运行能在IIS
和ASP.NET
环境的工作流变得简单。
顺序工作流( sequential workflow ) 是为执行一种由一系列预定义的步骤组成的任务而设计的。这种体系结构是模拟基于过程的应用程序的。这一节将用几个步骤来编写一个简单的开支报告程序,这个小程序使用 WinFrom 做界面,用顺序工作流做业务逻辑。
这个小程序有一个 TextBox 来输入开支报告的总数,一个 Button 点击提交报告。工作流将评估开支,如果开支小于 1000 则提请领班审批,如果大于等于 1000 则提请经理审批。之后,工作流会发送一个审批意见,此时,出现一个 Label 显示审批意见,两个 Button 分别表示通过和拒绝审批。当某一个按钮被点击的时候,应用程序会通知回应工作流,工作流继续处理发生的事件。
开始构造顺序工作流
创建工作流类
WWF SDK
中定义了一个
SequentialWorkFlow
类,我们定义一个
ExpenseRoportWorkflow
类,并继
承自SequentialWorkflow
,这样就创建一个顺序工作流。如:
using
System;2
using
System.Workflow.Activities;3
using
System.Workflow.Activities.Rules;4

5
namespace
Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow6

{7
[RuleConditionsAttribute(
typeof
(Microsoft.Samples.Workflow.Quickstarts.SequentialWorkflow.ExpenseReportWorkflow))]8
public
sealed
partial
class
ExpenseReportWorkflow : System.Workflow.Activities.SequentialWorkflow9

{10
public
ExpenseReportWorkflow()11

{12

13
}
14
}
15
}
16
声明工作流参数
在一个工作流运行时,它可以从宿主应用程序中接收参数。参数 是ParameterDeclaration 类型的对象,一旦工作流初始化完成,参数的值就能通过工作流的Parameters 集合来访问。
这里的开始报告程序用了两个参数。第一个参数是开支的总数;第二个是一个传出参数,用来放置审批意见。
定义一个新的方法InitializeComponent ,并在构造 ExpenseRoportWorkflow 类的构造函数中调用它。一下的例子示范了怎样定义两个参数并把它们加到 Parameters 集合中。
1
public
ExpenseReportWorkflow()2

3

{4

5
InitializeComponent();6

7
}
8

9
10

11
private
void
InitializeComponent()12

13

{14

15
System.Workflow.ComponentModel.ParameterDeclaration Amount
=
new
System.Workflow.ComponentModel.ParameterDeclaration();16

17
System.Workflow.ComponentModel.ParameterDeclaration Result
=
new
System.Workflow.ComponentModel.ParameterDeclaration();18

19
//
20

21
//
Workflow Parameters22

23
//24
25
Amount.Direction
=
System.Workflow.ComponentModel.ParameterDirection.In;26

27
Amount.Name
=
"
Amount
"
;28

29
Amount.Type
=
typeof
(
int
);30

31
Amount.Value
=
null
;32

33
Result.Direction
=
System.Workflow.ComponentModel.ParameterDirection.Out;34

35
Result.Name
=
"
Result
"
;36

37
Result.Type
=
typeof
(
string
);38

39
Result.Value
=
null
;40

41
this
.Parameters.Add(Amount);42

43
this
.Parameters.Add(Result);44

45
}
46

47
使用IfElse 活动
IfElse 活动 用条件表达式来控制工作流中流程的运行。工作流将根据条件表达式的结果来决定执行条件分支(IfElseBranch ) 中的哪一个活动。
例子中将使用IfElse 活动。通过判断从宿主应用程序中传入的Amount 参数的值是否小于1000 ,来决定是否将审报发送到领班,否则发送到经理。
创建IfElse 活动
1 .定义4 个私有变量
|
类型 |
名称 |
|
IfElse |
evaluateExpenseReportAmount |
|
IfElseBranch |
ifNeedsLeadApproval |
|
IfElseBranch |
elseNeedsManagerApproval |
|
CodeCondition |
ifElseLogicStatement |
2 .在 InitializeComponent 中用默认构造函数实例以上4 个对象。
以下的代码示例了怎样创建IfElse 活动,并用IfElseBranch 活动联系两个逻辑分支。你需要把以下代码放到InitializeComponent 方法底部。
//
2

3
//
EvaluateExpenseReportAmount4

5
//
6
7
this
.EvaluateExpenseReportAmount.Activities.Add(
this
.ifNeedsLeadApproval);8

9
this
.EvaluateExpenseReportAmount.Activities.Add(
this
.elseNeedsManagerApproval);10

11
this
.EvaluateExpenseReportAmount.ID
=
"
EvaluateExpenseReportAmount
"
;12

13
//
14

15
//
ifNeedsLeadApproval16

17
//
18
19
this
.ifNeedsLeadApproval.Activities.Add(
this
.invokeGetLeadApproval);20

21
ifElseLogicStatement.Condition
+=
new
System.Workflow.Activities.ConditionalExpression(
this
.DetermineApprovalContact);22

23
this
.ifNeedsLeadApproval.Condition
=
ifElseLogicStatement;24

25
this
.ifNeedsLeadApproval.ID
=
"
ifNeedsLeadApproval
"
;26

27
//
28

29
//
elseNeedsManagerApproval30

31
//
32
33
this
.elseNeedsManagerApproval.Activities.Add(
this
.invokeGetManagerApproval);34

35
this
.elseNeedsManagerApproval.Condition
=
null
;36

37
this
.elseNeedsManagerApproval.ID
=
"
elseNeedsManagerApproval
"
;38
WWF 在IfElse 活动 中,有两种评估条件表达式的方式。一种是RoleCondition ,这个对象通过使用一组规则来判断条件表达式的结果;另一种就是使用CodeCondition 活动。CodeCondition 使用一个回调方法,这个回调方法返回一个代表评估结果的布尔值。上面的例子就是使用CodeCondition 来决定条件表达式的值。如果Amount 参数小于1000 ,回调方法返回true ,否则返回false 。以下的代码就是这个回调函数的定义,你可以把它加到工作流类的定义中。
private
bool
DetermineApprovalContact(
object
sender, EventArgs e)2

3

{4

5
if
( Convert.ToInt32(
this
.Parameters[
"
Amount
"
].Value)
<
1000
)6

7
return
true
;8

9
10

11
return
false
;12

13
}
14
构造IfElse 分支(IfElseBranch )活动
WWF顺序工作流实战
本文介绍如何使用Windows Workflow Foundation (WWF) 开发顺序工作流应用程序,包括工作流类的创建、参数声明及使用IfElse活动进行逻辑分支控制。
960

被折叠的 条评论
为什么被折叠?



