在现实中的规则常常会有对数组类参数进行校验的情况,要求其全部通过或者至少有一个通过的情况,比如商家会发布一系列的任务,如果你能通过其中的任意一个挑战便能获取积分。这次我们使用 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})));
使用该规则
使用和其他规则完全一致
当没有任务完成时,获取积分失败
当有任一任务完成时,获取积分成功