首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 4.0 子流程實現方案:Bookmark 驅動的父子協作模式

     編輯:關於.NET

場景

工作流服務中常需啟動子流程。結合 Bookmark 實現主流程掛起/恢復與子流程生命週期管理。

持久化擴展

基於自定義持久化表新增 ParentId 欄位標識父流程:

持久化表結構

主流程設計

主流程圖

三節點:

  1. 第一站審核:Bookmark
  2. 啟用子流程:自定義活動
  3. 第二站審核:Bookmark

Bookmark 活動基類

public sealed class Read<TResult> : NativeActivity<TResult> {
    public string BookmarkName { get; set; }
    public InArgument<string> Text { get; set; }
    protected override bool CanInduceIdle => true;
    protected override void Execute(NativeActivityContext context) {
        context.CreateBookmark(BookmarkName, Continue);
    }
    void Continue(NativeActivityContext context, Bookmark bookmark, object obj) {
        Result.Set(context, (TResult)obj);
    }
}

啟用子流程活動

public sealed class CallChild : Activity {
    public string FlowName { get; set; }
    public CallChild() {
        Implementation = new Func<Activity>(CreateBody);
    }
    Activity CreateBody() => new Sequence {
        DisplayName = "子流程",
        Activities = {
            new ChildCodeActivity { FlowName = this.FlowName },
            new Read<string> { BookmarkName = "CallChild" }
        }
    };
}

ChildCodeActivity 真正啟動子流程並寫入 ParentId:

sealed class ChildCodeActivity : CodeActivity {
    public string FlowName { get; set; }
    protected override void Execute(CodeActivityContext context) {
        Guid childGuid = WorkFlowRun.CreateAndRun(FlowName);
        var obj = InstancesTableBiz.GetInstancesTable(childGuid);
        obj.ParentId = context.WorkflowInstanceId;
        InstancesTableBiz.UpdateInstancesTable(obj);
    }
}

子流程設計

子流程圖

兩個 Bookmark 審核節點 + 結束節點(關鍵:負責恢復父流程)。

結束活動

public sealed class End : CodeActivity {
    public InArgument<string> Text { get; set; }
    protected override void Execute(CodeActivityContext context) {
        string text = context.GetValue(Text);
        Guid id = context.WorkflowInstanceId;
        var obj = InstancesTableBiz.GetInstancesTable(id);
        if (obj.ParentId != Guid.Empty) {
            WorkFlowRun.Submit(obj.ParentId, "ParentProcess", "returnMain"); // 恢復父流程 Bookmark
        }
    }
}

協作流程總結

  1. 主流程跑到 CallChild → ChildCodeActivity 啟動子流程實例,記錄 ParentId
  2. 主流程在 Read<string> (Bookmark="CallChild") 處掛起
  3. 子流程跑完 → End 讀取 ParentId → WorkFlowRun.Submit 恢復父流程 Bookmark
  4. 父流程繼續執行後續節點

此方案經實戰驗證,歡迎提出更優方案交流。出處:https://zhuqil.cnblogs.com

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved