C# RulesEngine 规则引擎:从入门到看懵

说明RulesEngine 是 C# 写的一个规则引擎类库,读者可以从这些地方了解它:
仓库地址:
https://github.com/microsoft/RulesEngine
使用方法:
https://microsoft.github.io/RulesEngine
文档地址:
https://github.com/microsoft/RulesEngine/wiki
什么是规则引擎?

照搬 https://github.com/microsoft/RulesEngine/wiki/Introduction#what-is-the-rules-engine
在企业项目中,关键或核心部分总是业务逻辑或业务规则,也就是 CRUD,这些系统都有一个共同的特征是,某个模块中的一些或许多规则或策略总会发生变化,例如购物网站的顾客折扣、物流企业的运价计算等 。随着这些变化而来的是大量的重复工作,如果系统没有足够的抽象,那么每当增加一种规则时,开发者需要在规则、回归测试、性能测试等方面的变化中编写代码 。
在 RulesEngine 中,微软对规则进行了抽象,这样核心逻辑总是得到稳定的、易于维护的,而规则的更改可以以一种简单的方式生成,而不需要更改代码库 。此外,系统的输入本质上是动态的,因此不需要在系统中定义模型,而是可以作为扩展对象或任何其他类型的对象作为输入,系统经过预定义的规则处理后,输出结果 。
它有以下特性:
  • Json based rules definition(基于 Json 的规则定义)
  • Multiple input support(多输入支持)
  • Dynamic object input support(动态对象输入支持)
  • C# Expression support(C # 表达式支持)
  • Extending expression via custom class/type injection(通过自定义类/类型注入扩展表达式)
  • Scoped parameters(范围参数)
  • Post rule execution actions(发布规则执行操作)

C# RulesEngine 规则引擎:从入门到看懵

文章插图
说人话就是,业务逻辑的输出结果受到多个因子影响,但是这些影响有一定规律的,那么适合将这些部分抽象出来,接着使用规则引擎处理,例如购物的各种优惠卷叠加之后的最终折扣价、跨区运输的不同类型的包裹运价计算等 。
笔者认为这个规则引擎主要由两部分构成:
  • 规则验证系统,例如根据规则验证字段、执行函数验证当前流程、输出执行结果;
  • 动态代码引擎,能够将字符串转换为动态代码,利用表达式树这些完成;
当然,这样说起来其实很抽象的,还得多撸代码,才能明白这个 RulesEngine 到底是干嘛的 。
安装新建项目后,nuget 直接搜索 RulesEngine 即可安装,在 nuget 介绍中可以看到 RulesEngine 的依赖:
C# RulesEngine 规则引擎:从入门到看懵

文章插图
FluentValidation 是一个用于构建强类型验证规则的 .NET 库,在 ASP.NET Core 项目中,我们会经常使用模型验证,例如必填字段使用 [Required]、字符串长度使用 [MaxLength] 等;但是因为是特性注解,也就是难以做到很多需要经过动态检查的验证方式,使用 FluentValidation 可以为模型类构建更加丰富的验证规则 。
而 FluentValidation 用在 RulesEngine 上,也是相同的用途,RulesEngine 最常常用做规则验证,检查模型类或业务逻辑的验证结果,利用 FluentValidation中丰富的验证规则,可以制作各种方便的表达式树,构建动态代码 。
怎么使用我们通过 RulesEngine 检查模型类的字段是否符合规则,来了解 RulesEngine 的使用方法 。
创建一个这样的模型类:
public class Buyer{public int Id { get; set; }public int Age { get; set; }// 是否为已认证用户public bool Authenticated { get; set; }}场景是这样的,用户下单购买商品,后台需要判断此用户是否已经成年、是否通过了认证 。

经验总结扩展阅读