前言:引擎組件的基本職責是負責流程流轉,但是在流轉過程中,除了對內部控制邏輯進行實現外,也不可避免的要去調用或者響應外部事件。本文主要描述外部事件的類型,以及調用方法過程。 1. 外部事件的類型 外部事件的類型是隨著引擎功能的需要而不斷增加,開發人員也可以在此基礎上進行擴展,目前主要常用的事件類型如 ...
前言:引擎組件的基本職責是負責流程流轉,但是在流轉過程中,除了對內部控制邏輯進行實現外,也不可避免的要去調用或者響應外部事件。本文主要描述外部事件的類型,以及調用方法過程。
1. 外部事件的類型
外部事件的類型是隨著引擎功能的需要而不斷增加,開發人員也可以在此基礎上進行擴展,目前主要常用的事件類型如下:
public enum ActionMethodType { LocalMethod, //本地程式 WebAPI, //調用WebAPI程式 SQL, //執行SQL腳本 StoreProcedure, //調用存儲過程 Python, //執行Python腳本 }
2. 外部事件的調用方法
2.1 本地程式
1) 節點屬性定義
2) 本地程式方法實現
要調用的外部服務類,需要首先繼承ExternalServiceBase類,同時實現IExternalService介面。下麵的OrderSubmitService類就是一個具體實現類。請參考Slickflow.Module.External項目。
/// <summary> /// 訂單提交服務類(對應訂單流程中訂單提交節點) /// </summary> public class OrderSubmitService : ExternalServiceBase, IExternalService { /// <summary> /// 業務邏輯前置調用方法 /// </summary> public override void Execute() { //實現用戶自己的業務邏輯 var id = DelegateService.GetID(); var amount = DelegateService.GetVariable("amount"); DoSomethingElse(amount, 20); } /// <summary> /// 業務邏輯具體實現方法 /// </summary> /// <param name="amount"></param> /// <param name="newAmount"></param> private void DoSomethingElse(string amount, int newAmount) { var intAmount = 0; int.TryParse(amount, out intAmount); if (intAmount < newAmount) { DelegateService.SetVariable("amount", newAmount.ToString()); } //調用其它業務處理邏輯 var session = DelegateService.GetSession(); //實現其它資料庫業務邏輯 //............................. } }
在引擎流轉執行過程中,當解析到節點上有調用外部事件的Action定義時,將會使用反射方法,查找到組件是否有OrderSubmitService類,並且是實現了ExtneralServiceBase和IExternalService 介面的服務類,才能被執行其中的Execute()方法,必須滿足上述的查找基類繼承和介面實現條件才能被反射執行,否則是不能被執行的。這樣可以確保是執行到了明確定義的事件程式代碼。
2.2 WebAPI
步驟1:節點屬性上的事件定義
步驟2:流程變數定義
通過WorkflowService介面寫入流程變數(WfProcessVariable),變數用來傳遞WebApi方法的參數,此處作為示例:
步驟3:被調用WebApi程式的介面方法實現示例
上述示例中有兩個參數:runner和role, 在WebApi的方法代碼中,可以使用JSON格式數據作為接收,然後根據做序列化處理。
2.3 SQL
在節點綁定事件中,可以執行SQL語句,SQL語句的文本和參數可以通過節點屬性來定義,如下圖所示:
流程變數的參數列表:
2.4 StoreProcedure
存儲過程是資料庫定義的包含SQL腳本語法的程式過程(比如把上述的SQL腳本單獨保存為存儲過程),預設限定在同一個資料庫實例中,支持入口參數,定義時,指定參數名稱還有存儲過程的名稱就可以。
2.5 Python
Python腳本調用通SQL腳本調用,需要複製Python腳本,然後申明參數列表。需要主要的是目前僅支持IronPython版本。
3. 總結:
在跟外部事件交互調用過程中,調用邏輯統一封裝在ActionExecutor.cs文件中,代碼實現並沒有特別複雜,主要是統一做了參數的存儲和調用的處理,其中參數存在WfProcessVariable表中,然後在事件調用過程中,使用DelegateService方法來讀取參數列表,從而完成最終方法的調用。
客戶方如果對一些代碼的實現有特殊的要求,客戶方開發人員可以在此基礎上完成二次開發或者定製,其基本要求是明白以下三個要素:節點屬性定義讀取、流程變數的存儲和讀取以及動態方法的調用。