在现实中的规则常常会有对数组类参数进行校验的情况,要求其全部通过或者至少有一个通过的情况,比如商家会发布一系列的任务,如果你能通过其中的任意一个挑战便能获取积分。这次我们使用 RulesEngine 的自定义参数对数组类参数进行规则校验。
生成带有自定义参数的规则
首先我们需要生产一个带有自定义参数的规则
{
"WorkflowName": "Events",
"Rules": [
{
"RuleName": "Completed one of the events",
"ErrorMessage": "None of the events is completed",
"ErrorType": "Error",
"SuccessEvent": "You got the event points!",
"RuleExpressionType": "LambdaExpression",
"localParams": [
{
"name": "completedEvents",
"expression": "events.Where(Status == \"Completed\")"
}
],
"Expression": "completedEvents.Any()"
}
]
}
复制代码
该规则有两个的特点
- 引入了
localParams
- 这是一个数组
- 每个元素包含
name
和expression
两个参数 - 其中
name
用于标识 - 在
expression
中对传入的参数给定了Where
条件,对其 单个元素 进行校验。
- 在
localParams
同一层级的expression
通过localParams
的name
对最终结果进行汇总- 不同的元素可以以
And
或者Or
进行连接 - 每个元素可以使用
Any
或者All
进行结果限定
- 不同的元素可以以
这一段有点复杂,可能需要自己练习体会一下。
使用带有自定义参数的规则
该规则的使用和其他的规则使用没有什么不同,只是传入的参数是一个数组,因此转换时需要先定义其类型,再转化成对应数组的链表。
声明类型
public class Event
{
public string Name { get; set; }
public string Status { get; set; }
}
复制代码
传入规则校验参数
var input = new List<RuleParameter>();
input.Add(new RuleParameter("events", JsonSerializer.Deserialize<List<Event>>(
args.GetProperty("events").GetRawText(),
new JsonSerializerOptions {PropertyNameCaseInsensitive = true})));
复制代码
使用该规则
使用和其他规则完全一致
当没有任务完成时,获取积分失败
当有任一任务完成时,获取积分成功