C# RulesEngine 规则引擎:从入门到看懵( 三 )

RuleParameter
var rp1 = new RuleParameter("buyer", new Buyer{Id = 666,Age = 20,Authenticated = true});var rp2 = new RuleParameter("vip", new VIP{Id = 666,IsVIP = false});

相当于表达式树:
ParameterExpression rp1 = Expression.Parameter(typeof(Buyer), "buyer");ParameterExpression rp2 = Expression.Parameter(typeof(VIP), "vip");可以参考笔者的表达式树系列文章:https://ex.whuanle.cn/
然后重新设计 JSON,增加一个 Rule:
[{ "WorkflowName": "Test", "Rules": [{"RuleName": "CheckAuthenticated","Expression": "buyer.Authenticated == true"},{"RuleName": "CheckAge","Expression": "buyer.Age >= 18"},{"RuleName": "CheckVIP","Expression": "vip.IsVIP == true"} ]}]然后执行此 Workflow:
List<RuleResultTree> resultList = await bre.ExecuteAllRulesAsync("Test", rp1, rp2);
C# RulesEngine 规则引擎:从入门到看懵

文章插图
完整代码:
static async Task Main(){// 定义var rulesStr = ... ... // JSONvar workflows = JsonConvert.DeserializeObject<List<Workflow>>(rulesStr)!;var bre = new RulesEngine.RulesEngine(workflows.ToArray());var rp1 = new RuleParameter("buyer", new Buyer{Id = 666,Age = 20,Authenticated = true});var rp2 = new RuleParameter("vip", new VIP{Id = 666,IsVIP = false});List<RuleResultTree> resultList = await bre.ExecuteAllRulesAsync("Test", rp1, rp2);foreach (var item in resultList){Console.WriteLine("规则名称:{0},验证结果:{1}", item.Rule.RuleName, item.IsSuccess);}}全局参数、本地参数全局参数在 Workflow 中可以定义全局参数,参数对 Workflow 内的所有 Rule 起效,所有 Rule 都可以使用它 。
定义示例:
"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 里面定义了执行代码:

经验总结扩展阅读