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


"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});定义规则计算,每个规则计算的是自己的折扣:
[{ "WorkflowName": "Test", "GlobalParams": [{"Name": "value","Expression": "discount.Value" }], "Rules": [{"RuleName": "CheckAge","Expression": "buyer.age < 18","Actions": {"OnSuccess": {"Name": "OutputExpression","Context": {"Expression": "value * 0.9"}}}},{"RuleName": "CheckVIP","Expression": "vip.IsVIP == true","Actions": {"OnSuccess": {"Name": "OutputExpression","Context": {"Expression": "value * 0.9"}}}} ]}]
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 = 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});List resultList = await bre.ExecuteAllRulesAsync("Test", rp1, rp2, rp3);var discount = 1.0;foreach (var item in resultList){if (item.ActionResult != null && item.ActionResult.Output != null){Console.WriteLine($"{item.Rule.RuleName} 折扣优惠:{item.ActionResult.Output}");discount = discount * (double)item.ActionResult.Output;}}Console.WriteLine($"最终折扣:{discount}");}

经验总结扩展阅读