C# RulesEngine 規則引擎:從入門到看懵( 三 )


定義示例:
"WorkflowName": "Test", "GlobalParams": [{"Name": "age","Expression": "buyer.Age" }],參數的值,可以定義為常量,也可以來源于傳入的參數 。
修改上一個小節的示例 , 在 Rule CheckAge 中,使用這個全局參數 。

C# RulesEngine 規則引擎:從入門到看懵

文章插圖
[{ "WorkflowName": "Test", "GlobalParams": [{"Name": "age","Expression": "buyer.Age" }], "Rules": [{"RuleName": "CheckAuthenticated","Expression": "buyer.Authenticated == true"},{"RuleName": "CheckAge","Expression": "age >= 18"},{"RuleName": "CheckVIP","Expression": "vip.IsVIP == true"} ]}]本地參數本地參數在 Rule 內定義,只對當前 Rule 起效 。
C# RulesEngine 規則引擎:從入門到看懵

文章插圖
[{ "WorkflowName": "Test", "Rules": [{"RuleName": "CheckAuthenticated","LocalParams": [{"Name": "age","Expression": "buyer.Age"}],"Expression": "buyer.Authenticated == true"},{"RuleName": "CheckAge","Expression": "age >= 18"},{"RuleName": "CheckVIP","Expression": "vip.IsVIP == true"} ]}]在定義參數時,參數的值可以通過執行函數來獲?。?
"LocalParams":[{"Name":"mylocal1","Expression":"myInput.hello.ToLower()"}],LocalParams 可以使用 GlobalParams 的參數再次生成新的變量 。
C# RulesEngine 規則引擎:從入門到看懵

文章插圖
"GlobalParams":[{"Name":"myglobal1""Expression":"myInput.hello"}],"Rules":[{"RuleName": "checkGlobalAndLocalEqualsHello","LocalParams":[{"Name": "mylocal1","Expression": "myglobal1.ToLower()"}]},定義驗證成功、失敗行為可以為每個 Rule 定義驗證成功和失敗后執行一些代碼 。
格式示例:
"Actions": {"OnSuccess": {"Name": "OutputExpression","Context": {"Expression": "input1.TotalBilled * 0.8"}},"OnFailure": {"Name": "EvaluateRule","Context": {"WorkflowName": "inputWorkflow","ruleName": "GiveDiscount10Percent"}}}OutputExpression 里面定義了執行代碼:
"Name": "OutputExpression","Context": {"Expression": "input1.TotalBilled * 0.8"}EvaluateRule 定義了執行另一個 Workflow 的 Rule , 
"Name": "EvaluateRule","Context": {"WorkflowName": "inputWorkflow","ruleName": "GiveDiscount10Percent"}
C# RulesEngine 規則引擎:從入門到看懵

文章插圖
OnSuccess 、OnFailure 里面,內部結構如下所示:
"Name": "OutputExpression",//Name of action you want to call"Context": {//This is passed to the action as action context"Expression": "input1.TotalBilled * 0.8"}"Name": "EvaluateRule","Context": {"WorkflowName": "inputWorkflow","ruleName": "GiveDiscount10Percent"}Name:{xxx} 中的 {xxx} 是一個具體的執行器名稱,不是隨便定義的 , OutputExpressionEvaluateRule 都是自帶的執行器,所謂的執行器就是一個 Func<ActionBase>,在后面的 自定義執行器 中 , 可以了解更多 。
Context 里面的內容,是一個字典,這些 Key/Value 會被當做參數傳遞給執行器,每個執行器要求設置的 Context 是不一樣的 。
另外每個 Rule 都可以定義以下三個字段:
"SuccessEvent": "10","ErrorMessage": "One or more adjust rules failed.","ErrorType": "Error",ErrorType 有兩個選項,Warn、Error , 如果這個 Rule 的表達式錯誤,那么是否彈出異常 。如果設置為 Warn,Rule 有問題,驗證結果則會是 false,而不會報異常;如果是 Error,那么這個 Rule 會中止 Workflow 的執行 , 程序會報錯 。
C# RulesEngine 規則引擎:從入門到看懵

文章插圖
SuccessEventErrorMessage 對應,只是成功、失敗的提示消息 。
計算折扣前面提到的都是驗證規則 , 接下來我們將會使用 RulesEngine 實現規則計算 。
這里規定,基礎折扣為 1.0 , 如果用戶小于 18 歲,打 9 折,如果用戶是 VIP,打 9 折 , 兩個規則獨立 。
如果是小于 18歲,則 1.0 * 0.9如果是 VIP , 則 1.0 * 0.9定義一個模型類 , 用于傳遞折扣基值 。
// 折扣public class Discount{public double Value{get; set;}}定義三個參數:
var rp1 = new RuleParameter("buyer", new Buyer{Id = 666,Age = 16,});var rp2 = new RuleParameter("vip", new VIP{Id = 666,IsVIP = true});var rp3 = new RuleParameter("discount", new Discount{Value = https://www.huyubaike.com/biancheng/1.0});

推薦閱讀