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

1,068 阅读2分钟

在现实中的规则常常会有对数组类参数进行校验的情况,要求其全部通过或者至少有一个通过的情况,比如商家会发布一系列的任务,如果你能通过其中的任意一个挑战便能获取积分。这次我们使用 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. 每个元素包含 name 和 expression 两个参数
    3. 其中 name 用于标识
    4. 在 expression 中对传入的参数给定了 Where 条件,对其 单个元素 进行校验。
  2. 在 localParams 同一层级的 expression 通过 localParams 的 name 对最终结果进行汇总
    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