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});
相当于表达式树:然后重新设计 JSON,增加一个 Rule:
ParameterExpression rp1 = Expression.Parameter(typeof(Buyer), "buyer");ParameterExpression rp2 = Expression.Parameter(typeof(VIP), "vip");
可以参考笔者的表达式树系列文章:https://ex.whuanle.cn/
[{ "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);
文章插图
完整代码:
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
中,使用这个全局参数 。文章插图
[{ "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 起效 。文章插图
[{ "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
的参数再次生成新的变量 。文章插图
"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
里面定义了执行代码:
经验总结扩展阅读
- 我的世界如何附魔(我的世界附魔叠加规则)
- maven 重复依赖不同版本 选择规则
- 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng
- 德州扑克的规则是怎样的(德州扑克口诀顺口溜)
- Silky微服务框架之服务引擎
- 转弯不让直行是全责吗
- 红心大战玩法(网上红心大战规则)
- 红心大战怎么玩(红心大战的玩法和规则)
- 红心大战规则详细讲解(网上红心大战规则)
- sentinel的四种流控规则介绍