"Name": "OutputExpression","Context": {"Expression": "input1.TotalBilled * 0.8"}
EvaluateRule
定义了执行另一个 Workflow 的 Rule,
"Name": "EvaluateRule","Context": {"WorkflowName": "inputWorkflow","ruleName": "GiveDiscount10Percent"}

文章插图
在
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}
是一个具体的执行器名称,不是随便定义的,OutputExpression
、EvaluateRule
都是自带的执行器,所谓的执行器就是一个 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 的执行,程序会报错 。
文章插图
SuccessEvent
跟 ErrorMessage
对应,只是成功、失败的提示消息 。计算折扣前面提到的都是验证规则,接下来我们将会使用 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"}}}} ]}]

文章插图
完整代码:
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}");}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 我的世界如何附魔(我的世界附魔叠加规则)
- maven 重复依赖不同版本 选择规则
- 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng
- 德州扑克的规则是怎样的(德州扑克口诀顺口溜)
- Silky微服务框架之服务引擎
- 转弯不让直行是全责吗
- 红心大战玩法(网上红心大战规则)
- 红心大战怎么玩(红心大战的玩法和规则)
- 红心大战规则详细讲解(网上红心大战规则)
- sentinel的四种流控规则介绍