使用 RulesEngine 实现数组类参数进行规则校验

在现实中的规则常常会有对数组类参数进行校验的情况,要求其全部通过或者至少有一个通过的情况,比如商家会发布一系列的任务,如果你能通过其中的任意一个挑战便能获取积分。这次我们使用 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()"
        }
    ]
}
复制代码

该规则有两个的特点

  1. 引入了 localParams
    1. 这是一个数组
    2. 每个元素包含 nameexpression 两个参数
    3. 其中 name 用于标识
    4. expression 中对传入的参数给定了 Where 条件,对其 单个元素 进行校验。
  2. localParams 同一层级的 expression 通过 localParamsname 对最终结果进行汇总
    1. 不同的元素可以以 And 或者 Or 进行连接
    2. 每个元素可以使用 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})));
复制代码

使用该规则

使用和其他规则完全一致

当没有任务完成时,获取积分失败

获取积分失败.png

当有任一任务完成时,获取积分成功

获取积分成功.png

分类:
后端
标签: