第1章 WF快速入门 1
1.1 为什么需要工作流 1
1.1.1 工作流各不相同 1
1.1.2 为什么选择WF 2
1.2 开发环境 3
1.3 Hello Workflow 3
1.3.1 创建工作流项目 4
1.3.2 工作流设计器 6
1.3.3 使用工作流活动 6
1.3.4 输入代码 7
1.3.5 承载工作流运行时 8
1.3.6 运行应用程序 10
1.4 传递参数 10
1.4.1 声明属性 11
1.4.2 在运行时中传递值 11
1.5 作出决策 13
1.5.1 创建工作流库 13
1.5.2 添加工作流属性 13
1.5.3 添加IfElse活动 14
1.5.4 添加计算逻辑 17
1.5.5 创建计算器客户端 19
1.5.6 测试和调试计算器 23
1.6 小结 25
第2章 基础结构概述 26
2.1 工作流类型 26
2.1.1 顺序工作流 26
2.1.2 状态机工作流 26
2.1.3 选择工作流类型 27
2.2 基础结构交付项 28
2.2.1 类库和基础结构 28
2.2.2 运行时引擎 29
2.2.3 运行时服务 30
2.2.4 设计时工具 30
2.2.5 .NET 2.0运行时 30
2.3 运行时环境 30
2.3.1 应用程序宿主进程 31
2.3.2 运行时引擎 32
2.3.3 已注册的核心服务 33
2.3.4 已注册的本地服务 36
2.3.5 工作流实例 37
2.4 设计时环境 39
2.4.1 工作流创作模式 39
2.4.2 项目模板 40
2.4.3 工作流设计器 41
2.4.4 活动设计器 45
2.4.5 规则条件编辑器 46
2.4.6 Ruleset编辑器 48
2.4.7 工作流调试器 51
2.4.8 命令行工作流编译器 51
2.4.9 命令行通信活动生成器 52
2.5 小结 52
第3章 活动 53
3.1 理解活动 53
3.1.1 活动的两个访问者 53
3.1.2 类层次结构 54
3.2 探讨标准活动 55
3.2.1 自定义工作流逻辑 55
3.2.2 流控制 55
3.2.3 状态管理 57
3.2.4 事件处理 58
3.2.5 本地服务通信 59
3.2.6 规则 59
3.2.7 Web服务 59
3.2.8 工作流服务 60
3.2.9 事务、补偿和同步 61
3.2.10 异常和错误处理 62
3.3 标准活动摘要 62
3.4 添加工作流逻辑 64
3.5 使用CodeActivity 64
3.5.1 创建项目 65
3.5.2 定义工作流参数 65
3.5.3 验证账户 69
3.5.4 验证产品 70
3.5.5 录入订单 70
3.5.6 运行工作流 74
3.5.7 总结此方法 77
3.6 开发自定义活动 77
3.6.1 为什么使用自定义活动 77
3.6.2 两种访问者的设计 78
3.6.3 创建项目 78
3.6.4 实现账户验证活动 78
3.6.5 实现产品验证活动 82
3.6.6 实现订单录入活动 84
3.6.7 定义工作流参数 87
3.6.8 定义工作流 88
3.6.9 运行工作流 92
3.6.10 总结此方法 95
3.7 增强设计体验 96
3.7.1 验证活动 96
3.7.2 自定义工具箱行为 100
3.7.3 自定义设计器 104
3.8 小结 108
第4章 承载工作流运行时 109
4.1 承载概述 109
4.2 简单的工作流承载 110
4.2.1 实现测试工作流 110
4.2.2 实现简单宿主应用程序 112
4.3 改进的工作流承载 117
4.3.1 实现工作流实例包装 117
4.3.2 实现工作流管理器类 119
4.3.3 承载工作流管理器 127
4.3.4 通过App.config配置运行时 133
4.4 控制工作流实例 136
4.5 同步的工作流执行 139
4.6 小结 142
第5章 流控制 143
5.1 条件类型 143
5.2 使用IfElseActivity 144
5.2.1 使用代码条件的IfElseActivity 144
5.2.2 使用规则条件的IfElseActivity 150
5.3 使用WhileActivity 153
5.3.1 实现工作流 153
5.3.2 测试工作流 156
5.4 使用ParallelActivity 158
5.4.1 实现工作流 159
5.4.2 测试工作流 162
5.4.3 添加DelayActivity 164
5.5 使用ReplicatorActivity 165
5.5.1 实现顺序工作流 166
5.5.2 测试顺序工作流 169
5.5.3 实现并行工作流 170
5.5.4 测试并行工作流 174
5.5.5 使用ReplicatorActivity事件 176
5.5.6 中断执行 176
5.6 使用ConditionedActivityGroup 176
5.6.1 实现工作流 177
5.6.2 测试工作流 180
5.7 使用InvokeWorkflowActivity 182
5.8 使用TerminateActivity 183
5.9 使用SuspendActivity 183
5.10 小结 183
第6章 本地服务 184
6.1 了解本地服务 184
6.1.1 实现本地服务 185
6.1.2 使用本地服务 185
6.2 实现并使用本地服务 186
6.2.1 实现账户类 186
6.2.2 声明服务约定 186
6.2.3 实现本地服务类 187
6.2.4 实现工作流 188
6.2.5 测试工作流 191
6.3 从App.config加载 193
6.4 使用自定义活动 195
6.4.1 实现自定义活动 195
6.4.2 修改工作流 198
6.4.3 测试工作流 199
6.5 使用CallExternalMethodActivity 199
6.5.1 实现工作流 199
6.5.2 测试工作流 201
6.6 小结 201
第7章 事件驱动活动 202
7.1 使用事件驱动活动 202
7.2 使用HandleExternalEventActivity 203
7.2.1 创建项目 204
7.2.2 实现事件参数类 204
7.2.3 定义服务接口 205
7.2.4 实现本地服务 206
7.2.5 实现工作流 209
7.2.6 实现宿主应用程序 213
7.2.7 测试工作流 217
7.3 生成通信活动 218
7.3.1 生成活动 218
7.3.2 修改工作流 219
7.4 手动控制关联 220
7.4.1 实现事件参数类 221
7.4.2 定义服务接口 221
7.4.3 实现本地服务 222
7.4.4 实现工作流 223
7.4.5 测试工作流 225
7.5 使用EventHandlingScopeActivity 227
7.5.1 定义服务接口 228
7.5.2 实现本地服务 228
7.5.3 实现工作流 230
7.5.4 测试工作流 234
7.6 开发自定义事件驱动活动 236
7.6.1 了解工作流队列 237
7.6.2 事件驱动活动的需求 238
7.6.3 实现ProcessGuessActivity 239
7.6.4 实现SendHintActivity 246
7.6.5 修改工作流 248
7.6.6 修改宿主应用程序 249
7.6.7 测试工作流 252
7.7 小结 253
第8章 工作流持久性 254
8.1 了解持久性 254
8.1.1 持久化工作流的原因 254
8.1.2 持久性概述 255
8.2 使用SqlWorkflowPersistenceService 256
8.2.1 为持久性准备数据库 257
8.2.2 实现本地服务 257
8.2.3 实现工作流 259
8.2.4 实现宿主应用程序 261
8.2.5 测试应用程序 271
8.3 实现自定义持久性服务 273
8.3.1 了解抽象方法 274
8.3.2 实现服务 276
8.3.3 测试自定义服务 282
8.4 小结 284
第9章 状态机工作流 285
9.1 了解状态机 285
9.1.1 为什么需要状态机工作流 285
9.1.2 状态机概述 286
9.2 实现状态机工作流 290
9.2.1 设计CarStateMachine 290
9.2.2 定义本地服务接口 291
9.2.3 实现本地服务 292
9.2.4 实现工作流 295
9.2.5 实现宿主应用程序 302
9.2.6 测试应用程序 308
9.3 消除重复的事件处理程序 309
9.3.1 重构CarWorkflow 309
9.3.2 测试修改后的工作流 310
9.4 标识现有事件 311
9.4.1 询问工作流队列 311
9.4.2 修改CarStateMachine 311
9.4.3 测试应用程序 313
9.5 访问工作流运行时信息 314
9.5.1 修改CarStateMachine 314
9.5.2 测试应用程序 316
9.6 小结 316
第10章 事务和补偿 317
10.1 事务 317
10.1.1 事务的方式 317
10.1.2 WF对事务的支持 318
10.2 使用TransactionScopeActivity 319
10.2.1 实现AccountAdjustment-Activity 322
10.2.2 实现AccountTransfer-Workflow 326
10.2.3 测试工作流 329
10.3 了解补偿 334
10.4 使用可补偿活动 335
10.4.1 实现InventoryUpdate-Activity 335
10.4.2 实现OrderDetailActivity 339
10.4.3 实现OrderEntryWorkflow 344
10.4.4 测试工作流 350
10.5 参与工作批次 353
10.6 使用IPendingWork接口 353
10.6.1 实现本地服务 354
10.6.2 实现BatchedWorkWorkflow 356
10.6.3 测试工作流 357
10.7 小结 359
第11章 工作流规则 361
11.1 了解工作流规则 361
11.1.1 规则的组成 362
11.1.2 使用规则的原因 362
11.2 在WF中使用规则 363
11.2.1 定义规则 363
11.2.2 定义规则集 366
11.2.3 使用特性来标识依赖项 368
11.3 使用PolicyActivity来定义规则 369
11.3.1 实现SalesItem类 369
11.3.2 声明规则 370
11.3.3 测试工作流 375
11.4 跟踪规则 379
11.5 调整规则顺序 381
11.5.1 设置规则优先级 381
11.5.2 测试工作流 381
11.6 在规则中使用方法 383
11.6.1 添加操作方法 383
11.6.2 在规则集中使用方法 384
11.6.3 标识间接关系 385
11.7 在代码中执行规则集 386
11.7.1 实现SellItemSerialized-Workflow 386
11.7.2 测试工作流 389
11.8 在代码中构造规则集 389
11.8.1 实现SellItemInCode-Workflow 389
11.8.2 测试工作流 392
11.9 小结 393
第12章 异常和错误处理 394
12.1 理解工作流异常处理 394
12.2 探讨默认行为 396
12.2.1 实现ExceptionWorkflow 396
12.2.2 测试工作流 398
12.3 使用FaultHandlerActivity 400
12.3.1 处理ArithmeticException 400
12.3.2 处理DivideByZeroException 403
12.4 抑制异常 405
12.5 重新抛出异常 407
12.6 补偿和异常 408
12.6.1 实现CompensateWorkflow 408
12.6.2 测试工作流 410
12.7 使用CancellationHandlerActivity 412
12.7.1 实现CancelHandler-Workflow 412
12.7.2 测试工作流 414
12.8 小结 414
第13章 高级自定义活动 415
13.1 开发专用的复合活动 415
13.1.1 开发自定义活动 416
13.1.2 开发工作流 417
13.1.3 测试活动 418
13.2 开发通用的复合活动 420
13.2.1 了解活动执行计划 420
13.2.2 复合活动的执行模式 421
13.2.3 实现顺序活动 422
13.2.4 实现测试工作流 426
13.2.5 测试顺序活动 428
13.3 开发优先级顺序活动 429
13.3.1 实现优先级顺序活动 429
13.3.2 实现扩展提供程序 432
13.3.3 实现自定义设计器 434
13.3.4 实现测试工作流 435
13.3.5 测试优先级顺序活动 436
13.4 开发长时间运行的活动 436
13.4.1 实现本地服务 437
13.4.2 实现自定义活动 440
13.4.3 实现测试工作流 443
13.4.4 测试长时间运行的活动流 443
13.5 小结 445
第14章 动态工作流更新 446
14.1 了解动态更新 446
14.1.1 使用动态更新的原因 447
14.1.2 应用动态更新 447
14.1.3 防止动态更新 448
14.2 从宿主应用程序中应用更新 449
14.2.1 实现DynamicWorkflow 449
14.2.2 实现自定义活动 450
14.2.3 实现宿主应用程序 452
14.2.4 测试工作流 456
14.3 限制动态更新 456
14.4 从工作流中应用更新 458
14.4.1 实现SelfUpdatingWorkflow 458
14.4.2 实现宿主应用程序 461
14.4.3 测试工作流 462
14.5 更新规则条件 463
14.5.1 实现DynamicCondition-Workflow 463
14.5.2 实现宿主应用程序 464
14.5.3 测试工作流 468
14.6 替换规则条件 468
14.6.1 修改RuleDefinitions 468
14.6.2 修改宿主应用程序 470
14.6.3 测试修改后的应用程序 472
14.7 小结 472
第15章 工作流跟踪 473
15.1 了解工作流跟踪 473
15.1.1 跟踪服务 473
15.1.2 跟踪事件类型 474
15.1.3 自定义跟踪配置 475
15.1.4 使用跟踪数据 475
15.1.5 受益于工作流跟踪 476
15.2 使用SqlTrackingService 476
15.2.1 准备跟踪SQL数据库 477
15.2.2 开发测试工作流 477
15.2.3 开发宿主应用程序 479
15.2.4 执行宿主应用程序 481
15.2.5 获取跟踪数据 482
15.3 创建用户跟踪点 489
15.3.1 增强TrackingExample-Workflow 490
15.3.2 测试修改后的工作流 490
15.4 跟踪规则计算 491
15.4.1 实现TrackingRules-Workflow 491
15.4.2 测试工作流 492
15.5 使用自定义跟踪配置提取数据 493
15.5.1 使用跟踪配置 494
15.5.2 实现TrackingProfile-Helper 495
15.5.3 创建跟踪配置 499
15.5.4 测试跟踪配置 501
15.6 维护SQL跟踪数据库 502
15.6.1 分区 502
15.6.2 设置分区间隔时间 502
15.6.3 自动或手动分区 502
15.6.4 访问分区数据 503
15.6.5 分离或删除分区 503
15.7 开发跟踪服务 503
15.7.1 实现跟踪通道 504
15.7.2 实现跟踪服务 506
15.7.3 测试自定义跟踪服务 510
15.8 小结 512
第16章 Web服务和ASP.NET 513
16.1 将工作流发布为Web服务 513
16.1.1 了解Web服务活动 513
16.1.2 发布和配置 514
16.2 开发Web服务工作流 515
16.2.1 定义Web服务接口 515
16.2.2 定义MathServiceWorkflow 516
16.2.3 发布工作流 518
16.2.4 测试工作流 519
16.3 返回Web服务错误 521
16.3.1 修改MathServiceWorkflow 522
16.3.2 测试修改后的Web服务 523
16.4 开发状态化的Web服务 523
16.4.1 定义Web服务接口 524
16.4.2 实现MathServiceState-fulWorkflow 525
16.4.3 发布新工作流 528
16.4.4 测试Web服务 528
16.5 在工作流中调用Web服务 528
16.5.1 实现InvokeWebService-Workflow 529
16.5.2 测试工作流 532
16.6 在ASP.NET中使用工作流 533
16.6.1 实现DivideNumberWorkflow 534
16.6.2 实现UseWorkflowWebsite 534
16.6.3 测试工作流 538
16.7 小结 539
第17章 工作流服务和WCF集成 540
17.1 了解WCF 540
17.1.1 定义服务约定 541
17.1.2 配置终结点和绑定 542
17.1.3 承载和配置 543
17.2 了解工作流服务 543
17.2.1 使用ReceiveActivity 543
17.2.2 使用SendActivity 544
17.2.3 承载和配置 545
17.2.4 实例化和上下文管理 547
17.3 开发无状态的工作流服务 548
17.3.1 定义服务约定 548
17.3.2 实现工作流 549
17.3.3 配置工作流服务 550
17.3.4 测试工作流服务 551
17.4 IIS承载和客户端开发 552
17.4.1 创建IIS虚拟目录 553
17.4.2 创建.svc文件 553
17.4.3 配置Web.config文件 553
17.4.4 部署服务 554
17.4.5 开发客户端应用程序 555
17.5 自承载的工作流服务 557
17.5.1 开发服务宿主 558
17.5.2 配置服务宿主 559
17.5.3 更改客户端应用程序 560
17.5.4 测试服务宿主 561
17.6 定义工作流优先的服务 561
17.7 开发状态化的工作流服务 562
17.7.1 定义服务约定 563
17.7.2 实现工作流 564
17.7.3 在IIS中承载工作流服务 566
17.7.4 开发客户端应用程序 567
17.7.5 测试工作流服务 569
17.8 使用SendActivity 570
17.8.1 实现工作流 570
17.8.2 开发客户端应用程序 573
17.8.3 测试工作流 575
17.9 上下文和对话 575
17.9.1 定义服务约定 577
17.9.2 实现库存工作流 579
17.9.3 实现库存宿主 583
17.9.4 实现客户端工作流 586
17.9.5 实现客户端宿主 592
17.9.6 测试应用程序 595
17.10 小结 596
第18章 工作流序列化和标记 598
18.1 了解工作流创作模式 598
18.1.1 仅限代码创作模式 598
18.1.2 代码分离创作模式 599
18.1.3 无代码创作模式 601
18.2 开发仅限代码工作流 602
18.2.1 实现工作流 603
18.2.2 测试工作流 604
18.2.3 查看生成的代码 605
18.3 开发代码分离工作流 607
18.3.1 实现工作流 607
18.3.2 测试工作流 608
18.3.3 查看标记 608
18.4 开发无代码工作流 609
18.4.1 实现工作流基类 609
18.4.2 实现自定义活动 610
18.4.3 定义工作流标记 611
18.4.4 增强WorkflowRuntime-Manager 612
18.4.5 测试工作流 614
18.5 在无代码工作流中使用规则 615
18.5.1 定义规则条件 616
18.5.2 修改工作流标记 617
18.5.3 测试工作流 618
18.6 序列化到标记 618
18.7 编译工作流 622
18.8 编译包含规则的工作流 625
18.9 在命令行中编译 628
18.10 反序列化标记 628
18.11 小结 632
第19章 承载工作流设计器 633
19.1 工作流设计器 633
19.1.1 设计器命名空间 634
19.1.2 设计器类 634
19.1.3 设计器服务 635
19.2 构建设计器应用程序 635
19.2.1 创建设计器项目 636
19.2.2 实现WorkflowLoader 637
19.2.3 实现WorkflowMenuService 645
19.2.4 实现WorkflowEvent-BindingService 649
19.2.5 实现EventProperty-Descriptor 653
19.2.6 实现WorkflowProperty-ValueService 657
19.2.7 实现WorkflowToolbox-Service 659
19.2.8 实现WorkflowDesigner 668
19.2.9 实现MainForm 674
19.2.10 实现AssemblyReference-Form 679
19.2.11 实现NewWorkflowForm 681
19.3 使用设计器 683
19.4 小结 687