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 规则引擎:从入门到看懵

文章插图
OnSuccessOnFailure 里面,内部结构如下所示:
"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 有两个选项,WarnError , 如果这个 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});

推荐阅读