受《WF本質論》啟發,本系列嘗試以 .NET 底層技術——可序列化委托——逐步構建一個微型工作流執行時。從最原始的「委托序列化/反序列化」起步,經過宿主與業務邏輯解耦、Activity 基類抽象、程序與資料分離、Frame/Stack 狀態管理、並行與書簽機制,十個版本層層遞進,完整呈現 WF 核心設計決策的來龍去脈。
.NET 委托可序列化,意味著「執行指標」可跨進程、跨機器持久化與恢復。這移除了程式碼對特定進程的「親和力」,實現水平擴展、長期暫停、甚至取消執行。系列第一版即展示:將委托序列化至檔案,下一次執行反序列化並 DynamicInvoke,即可接續輸出 "Hello world"。
| 版本 | 關鍵重構 | 核心收穫 |
|---|---|---|
| V1 | 單一程式直接序列化委托 | 驗證委托可跨進程恢復執行 |
| V2 | 引入 ReadReadWrite 類別,業務邏輯移出 Main | 宿主與業務初步分離,NextDelegate 統一簽名 |
| V3 | 定義 Activity 基類,消除宿主對具體步驟的耦合 | 宿主通用化,Activity 成為擴充點 |
| V4 | 拆分 Read1/Read2,嘗試共用讀取邏輯 | 發現狀態與委托耦合,難以複用 |
| V5 | 合併讀取類別,以名稱存取狀態而非靜態欄位 | 活動可複用,狀態外部化雛形 |
| V6 | 引入 Stack<Frame>,將委托與狀態移入 Frame,Sequence 執行邏輯下沉 | 程序(Sequence)與資料(Frame)徹底分離 |
| V7 | Frame 封裝堆疊操作,驅動所有執行流程 | 執行引擎核心成型 |
| V8 | Frame 樹狀結構支援多頂點,委托簽名改為 Action<Frame> | 實現真正並行:多個未完成活動共存 |
| V9 | 引入 Parallel 活動調度兩個 Read | 並行活動允許多個等待外部訊號的工作項 |
| V10 | 書簽機制:活動發訊號請求資料,宿主回填資料喚醒 | 完成「宿主↔工作流」雙向通訊閉環 |
MethodInfo + 活動 ID,斷開對原程式集的強參考;HomeMadeWF.zip 包含完整十個版本原始碼,建議逐版對照閱讀,體會每一步重構的動機與取捨。
雖然距離生產級 WF 尚遠,但此系列已揭示工作流引擎的靈魂:以可序列化的延續實現持久化,以 Frame 隔離狀態,以書簽連接外部世界。理解這些本質,方能駕馭任何工作流框架。