微软的 .NET规则引擎简介 | infoworld


每一个企业软件的核心是它的业务逻辑,即分析输入和创建适当输出的代码。这是我们把业务流程的步骤变成代码的方式,在工作流程的每一步都加入逻辑。这样,我们只需要编写必要的代码,就可以避免复杂性。

并非所有的业务逻辑都是一成不变的。一些流程,特别是那些对企业财务很关键的流程,往往是由外部规则和条例驱动的,这些规则和条例可能在短时间内发生变化。例如,你可能正在计算作为电子商务服务一部分的销售税,当政府政策迫使税率或这些税率的应用方式突然改变时。

这可能会让你突然不得不从其他项目中抽出资源来快速开发新的模块,以便在新法规生效后立即准备运行。开发资源并不便宜,所以需要的是一种将这些规则和条例外部化的方法,这样你就不需要改变你的代码,只需要改变它使用的规则。

答案是一个古老的问题:规则引擎。

在这里,输入值被测试,简单的规则被应用,返回的结果表明哪些规则被触发了。

业务逻辑的复杂方面可以保留在他们自己的模块和服务中;所有需要改变的是规则引擎的配置。
因此,例如,如果一项交易大于50美元,需要调用一项服务,而规则改变了,使其限制为45美元,你需要做的就是编辑和更新调用服务的规则,并将交易传递给它。

介绍微软的规则引擎
微软已经为.NET应用程序开发了一个相对容易使用的开源规则引擎库,可作为NuGet包或从GitHub获得。该库旨在为你的代码提供一个规则抽象,规则以JSON形式存储在你的应用程序之外,并使用.NET熟悉的lambda表达式语法编写规则。一个活跃的社区和定期更新使它成为一个有用的工具,非常值得考虑。

由于其规则在你的代码之外,你可以在任何时候改变规则,只需上传一个新的规则文件并重新启动你的应用程序。你可以为你的规则选择一个合适的存储空间,最好选择你所运行的平台,例如,在Web服务器上使用MySQL,在PC上使用文件系统,或者为Azure应用服务应用程序选择Azure Blob存储账户。

一旦你将规则引擎库添加到你的代码中,引擎就会解析规则和输入信息,将结果返回给你的应用程序,并允许根据引擎交付的状态继续处理。该库本身位于你的代码之外,作为一个引用的NuGet包工作,有一个包装器来处理规则的获取和缓存,以及根据规则评估的结果来驱动你的应用程序的其余部分。

为规则引擎构建规则
开始使用.NET规则引擎是比较简单的。你需要首先考虑如何将规则从你的应用程序中分离出来,然后考虑如何用lambda表达式来描述它们。你可以选择使用可以从lambda表达式中引用的公共类来构建自己的自定义规则,这种方法可以绕过lambda表达式只能使用.NET系统命名空间中的方法的相关限制。

你可以在项目的GitHub仓库中找到这些规则的JSON模式。这是一个全面的模式,但在实践中,你可能只需要一个相对基本的规则结构。首先给你的规则工作流起个名字,然后用一个嵌套的规则列表来跟进。每条规则都需要一个名称,一个成功后引发的事件,一个错误信息和类型,以及一个定义为lambda表达式的规则表达式。

你的规则表达式需要在规则引擎的输入方面进行定义。每个输入是一个对象,lambda函数评估与输入相关的各种值。每个值都需要被赋予一个测试,测试是逻辑表达式的一部分,当被评估为真时,将触发规则的成功事件。最好事先列出所有你想使用的规则,以及触发规则所需满足的条件。这样你就可以确认你所定义的规则符合你的应用程序的用例,使其能够被利益相关者所理解。

要使用规则引擎,首先使用构造函数来实例化库,以JSON格式加载工作流规则。一旦它启动并运行,从规则引擎中获得结果就是用工作流名称和当前输入来调用它,获得OnSuccess或OnFail事件并在你的应用程序中使用它们。维基提供了关于如何使用该库的详细说明。

建立你自己的规则编辑器
帮助建立规则的有用工具是一个Blazor UI库,它可以编辑新的规则,并以适当的格式为您的应用程序导出。你可以把它构建到你自己的代码中,这样你就可以把规则开发保持在你的防火墙内,或者有一个基于WebAssembly的渐进式网络应用程序的快速启动,开发人员可以把它安装在自己的设备上以构建符合模式的规则。

PWA规则编辑器以两种模式工作。首先,一个工作流驱动的视图使用lambda表达式构建规则。第二种选择是定义Input RuleParameters,它可以给规则自定义名称。同时,你可以在规则中使用局部参数,将其分解成更容易理解的元素,并有自己的名字,然后可以组合成一条规则。例如,一个局部参数可以与一个显示特定输入是否为特定值的表达式相关联,另一个表达式用于不同的输入。然后,与每个局部参数相关的结果可以在一个逻辑语句中结合起来,以确定完整的规则是否触发。

通过将规则与代码分离,并使用基于网络的编辑器来创建新的规则,我们可以建立一个工具,让业务分析员修改规则,而不需要开发人员的输入。这种方法可以节省时间和资源。这并不完全是推出你自己的类似Power Platform的工具,因为你限制了可以编辑的输入和规则,操作起来比更自由的Power Platform有更多的限制。即便如此,在预计会发生变化的领域给用户一些控制元素,可以确保这些变化及时进行,开发人员不需要临时转换任务。

使用这样的规则引擎可以简化应用程序的工作流程,将你的业务逻辑外部化,并允许快速更新,而其他开发方法和工具可能会阻止这种更新。微软对.NET库开发的开源方法允许你进入代码并进行修改,以支持你的业务需求,同时也让你利用社区驱动的性能改进和新功能。