定义示例:
"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
里面定义了执行代码:"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});
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- maven 重复依赖不同版本 选择规则
- 我的世界如何附魔(我的世界附魔叠加规则)
- 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng
- 德州扑克的规则是怎样的(德州扑克口诀顺口溜)
- Silky微服务框架之服务引擎
- 红心大战玩法(网上红心大战规则)
- sentinel的四种流控规则介绍
- 红心大战怎么玩(红心大战的玩法和规则)
- 红心大战规则详细讲解(网上红心大战规则)
- MasaFramework -- 缓存入门与规则配置