第1章 WF快速入門 1
1.1 為什么需要工作流 1
1.1.1 工作流各不相同 1
1.1.2 為什么選擇WF 2
1.2 開發(fā)環(huán)境 3
1.3 Hello Workflow 3
1.3.1 創(chuàng)建工作流項目 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 創(chuàng)建工作流庫 13
1.5.2 添加工作流屬性 13
1.5.3 添加IfElse活動 14
1.5.4 添加計算邏輯 17
1.5.5 創(chuàng)建計算器客戶端 19
1.5.6 測試和調試計算器 23
1.6 小結 25
第2章 基礎結構概述 26
2.1 工作流類型 26
2.1.1 順序工作流 26
2.1.2 狀態(tài)機工作流 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 運行時環(huán)境 30
2.3.1 應用程序宿主進程 31
2.3.2 運行時引擎 32
2.3.3 已注冊的核心服務 33
2.3.4 已注冊的本地服務 36
2.3.5 工作流實例 37
2.4 設計時環(huán)境 39
2.4.1 工作流創(chuàng)作模式 39
2.4.2 項目模板 40
2.4.3 工作流設計器 41
2.4.4 活動設計器 45
2.4.5 規(guī)則條件編輯器 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 狀態(tài)管理 57
3.2.4 事件處理 58
3.2.5 本地服務通信 59
3.2.6 規(guī)則 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 創(chuàng)建項目 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 開發(fā)自定義活動 77
3.6.1 為什么使用自定義活動 77
3.6.2 兩種訪問者的設計 78
3.6.3 創(chuàng)建項目 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 同步的工作流執(zhí)行 139
4.6 小結 142
第5章 流控制 143
5.1 條件類型 143
5.2 使用IfElseActivity 144
5.2.1 使用代碼條件的IfElseActivity 144
5.2.2 使用規(guī)則條件的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 中斷執(zhí)行 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 創(chuàng)建項目 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 開發(fā)自定義事件驅動活動 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章 狀態(tài)機工作流 285
9.1 了解狀態(tài)機 285
9.1.1 為什么需要狀態(tài)機工作流 285
9.1.2 狀態(tài)機概述 286
9.2 實現狀態(tài)機工作流 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章 工作流規(guī)則 361
11.1 了解工作流規(guī)則 361
11.1.1 規(guī)則的組成 362
11.1.2 使用規(guī)則的原因 362
11.2 在WF中使用規(guī)則 363
11.2.1 定義規(guī)則 363
11.2.2 定義規(guī)則集 366
11.2.3 使用特性來標識依賴項 368
11.3 使用PolicyActivity來定義規(guī)則 369
11.3.1 實現SalesItem類 369
11.3.2 聲明規(guī)則 370
11.3.3 測試工作流 375
11.4 跟蹤規(guī)則 379
11.5 調整規(guī)則順序 381
11.5.1 設置規(guī)則優(yōu)先級 381
11.5.2 測試工作流 381
11.6 在規(guī)則中使用方法 383
11.6.1 添加操作方法 383
11.6.2 在規(guī)則集中使用方法 384
11.6.3 標識間接關系 385
11.7 在代碼中執(zhí)行規(guī)則集 386
11.7.1 實現SellItemSerialized-Workflow 386
11.7.2 測試工作流 389
11.8 在代碼中構造規(guī)則集 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 抑制異?!?05
12.5 重新拋出異常 407
12.6 補償和異?!?08
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 開發(fā)專用的復合活動 415
13.1.1 開發(fā)自定義活動 416
13.1.2 開發(fā)工作流 417
13.1.3 測試活動 418
13.2 開發(fā)通用的復合活動 420
13.2.1 了解活動執(zhí)行計劃 420
13.2.2 復合活動的執(zhí)行模式 421
13.2.3 實現順序活動 422
13.2.4 實現測試工作流 426
13.2.5 測試順序活動 428
13.3 開發(fā)優(yōu)先級順序活動 429
13.3.1 實現優(yōu)先級順序活動 429
13.3.2 實現擴展提供程序 432
13.3.3 實現自定義設計器 434
13.3.4 實現測試工作流 435
13.3.5 測試優(yōu)先級順序活動 436
13.4 開發(fā)長時間運行的活動 436
13.4.1 實現本地服務 437
13.4.2 實現自定義活動 440
13.4.3 實現測試工作流 443
13.4.4 測試長時間運行的活動流 443
13.5 小結 445
第14章 動態(tài)工作流更新 446
14.1 了解動態(tài)更新 446
14.1.1 使用動態(tài)更新的原因 447
14.1.2 應用動態(tài)更新 447
14.1.3 防止動態(tài)更新 448
14.2 從宿主應用程序中應用更新 449
14.2.1 實現DynamicWorkflow 449
14.2.2 實現自定義活動 450
14.2.3 實現宿主應用程序 452
14.2.4 測試工作流 456
14.3 限制動態(tài)更新 456
14.4 從工作流中應用更新 458
14.4.1 實現SelfUpdatingWorkflow 458
14.4.2 實現宿主應用程序 461
14.4.3 測試工作流 462
14.5 更新規(guī)則條件 463
14.5.1 實現DynamicCondition-Workflow 463
14.5.2 實現宿主應用程序 464
14.5.3 測試工作流 468
14.6 替換規(guī)則條件 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 開發(fā)測試工作流 477
15.2.3 開發(fā)宿主應用程序 479
15.2.4 執(zhí)行宿主應用程序 481
15.2.5 獲取跟蹤數據 482
15.3 創(chuàng)建用戶跟蹤點 489
15.3.1 增強TrackingExample-Workflow 490
15.3.2 測試修改后的工作流 490
15.4 跟蹤規(guī)則計算 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 創(chuàng)建跟蹤配置 499
15.5.4 測試跟蹤配置 501
15.6 維護SQL跟蹤數據庫 502
15.6.1 分區(qū) 502
15.6.2 設置分區(qū)間隔時間 502
15.6.3 自動或手動分區(qū) 502
15.6.4 訪問分區(qū)數據 503
15.6.5 分離或刪除分區(qū) 503
15.7 開發(fā)跟蹤服務 503
15.7.1 實現跟蹤通道 504
15.7.2 實現跟蹤服務 506
15.7.3 測試自定義跟蹤服務 510
15.8 小結 512
第16章 Web服務和ASP.NET 513
16.1 將工作流發(fā)布為Web服務 513
16.1.1 了解Web服務活動 513
16.1.2 發(fā)布和配置 514
16.2 開發(fā)Web服務工作流 515
16.2.1 定義Web服務接口 515
16.2.2 定義MathServiceWorkflow 516
16.2.3 發(fā)布工作流 518
16.2.4 測試工作流 519
16.3 返回Web服務錯誤 521
16.3.1 修改MathServiceWorkflow 522
16.3.2 測試修改后的Web服務 523
16.4 開發(fā)狀態(tài)化的Web服務 523
16.4.1 定義Web服務接口 524
16.4.2 實現MathServiceState-fulWorkflow 525
16.4.3 發(fā)布新工作流 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 開發(fā)無狀態(tài)的工作流服務 548
17.3.1 定義服務約定 548
17.3.2 實現工作流 549
17.3.3 配置工作流服務 550
17.3.4 測試工作流服務 551
17.4 IIS承載和客戶端開發(fā) 552
17.4.1 創(chuàng)建IIS虛擬目錄 553
17.4.2 創(chuàng)建.svc文件 553
17.4.3 配置Web.config文件 553
17.4.4 部署服務 554
17.4.5 開發(fā)客戶端應用程序 555
17.5 自承載的工作流服務 557
17.5.1 開發(fā)服務宿主 558
17.5.2 配置服務宿主 559
17.5.3 更改客戶端應用程序 560
17.5.4 測試服務宿主 561
17.6 定義工作流優(yōu)先的服務 561
17.7 開發(fā)狀態(tài)化的工作流服務 562
17.7.1 定義服務約定 563
17.7.2 實現工作流 564
17.7.3 在IIS中承載工作流服務 566
17.7.4 開發(fā)客戶端應用程序 567
17.7.5 測試工作流服務 569
17.8 使用SendActivity 570
17.8.1 實現工作流 570
17.8.2 開發(fā)客戶端應用程序 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 了解工作流創(chuàng)作模式 598
18.1.1 僅限代碼創(chuàng)作模式 598
18.1.2 代碼分離創(chuàng)作模式 599
18.1.3 無代碼創(chuàng)作模式 601
18.2 開發(fā)僅限代碼工作流 602
18.2.1 實現工作流 603
18.2.2 測試工作流 604
18.2.3 查看生成的代碼 605
18.3 開發(fā)代碼分離工作流 607
18.3.1 實現工作流 607
18.3.2 測試工作流 608
18.3.3 查看標記 608
18.4 開發(fā)無代碼工作流 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 在無代碼工作流中使用規(guī)則 615
18.5.1 定義規(guī)則條件 616
18.5.2 修改工作流標記 617
18.5.3 測試工作流 618
18.6 序列化到標記 618
18.7 編譯工作流 622
18.8 編譯包含規(guī)則的工作流 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 創(chuàng)建設計器項目 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