亲爱的朋友们,我是许泽宇,今天我要和大家探讨一款强大的业务规则库——Microsoft RulesEngine。在软件开发中,业务逻辑的变更和扩展往往如同“潘多拉魔盒”,一旦打开就难以收拾。RulesEngine 的设计理念就是为了解决这个难题,它能够将业务逻辑独立出来,使得业务规则变更不再影响核心系统的稳定性。下面就为大家详细介绍这个在Github热门开源的神器。
https://github.com/microsoft/RulesEngine
RulesEngine 详解
首先,让我们来看看RulesEngine的官方定义:它是一个可用作库或NuGet包的工具,用于将业务逻辑、规则、策略从系统中抽象出来。简单的说,使用RulesEngine就能让你把规则存放在系统核心逻辑之外的存储中,这意味着任何的规则变动都将不会影响到核心系统。
如何安装
安装RulesEngine非常简单,只需前往nuget.org下载最新版本的NuGet包,并在你的项目中引用即可。
如何使用
RulesEngine提供了丰富的工作流配置方式,你可以根据提供的模式定义存储规则,并选择如Azure Blob Storage、Cosmos DB、Azure App Configuration、Entity Framework、SQL Servers、文件系统等任意合适的存储方式。当然,如果你的规则表达是Lambda表达式类型,那就更直截了当了。
编写规则实例
举个例子,如果你想为顾客制定一个购物打折规则,可以编写如下规则:
[
{
"WorkflowName": "Discount",
"Rules": [
{
"RuleName": "GiveDiscount10",
"SuccessEvent": "10",
"ErrorMessage": "One or more adjust rules failed.",
"ErrorType": "Error",
"RuleExpressionType": "LambdaExpression",
"Expression": "input1.country == \"india\" AND input1.loyaltyFactor <= 2 AND input1.totalPurchasesToDate >= 5000"
},
{
"RuleName": "GiveDiscount20",
"SuccessEvent": "20",
"ErrorMessage": "One or more adjust rules failed.",
"ErrorType": "Error",
"RuleExpressionType": "LambdaExpression",
"Expression": "input1.country == \"india\" AND input1.loyaltyFactor >= 3 AND input1.totalPurchasesToDate >= 10000"
}
]
}
]
编写完毕后,你可以通过以下代码将规则注入到Rules Engine中:
var rulesEngine = new RulesEngine.RulesEngine(workflow);
其中,workflow是一个基于上述模式解析的对象列表。初始化完成后,你需要执行Rules Engine的执行方法ExecuteAllRulesAsync:
List<RuleResultTree> response = await rulesEngine.ExecuteAllRulesAsync(workflowName, input);
执行结果将返回一个包含RuleResultTree列表的响应,告诉你每个规则是否通过。
仅通过代码的简单示例如下:
List<Rule> rules = new List<Rule>();
Rule rule = new Rule();
rule.RuleName = "Test Rule";
rule.SuccessEvent = "Count is within tolerance.";
rule.ErrorMessage = "Over expected.";
rule.Expression = "count < 3";
rule.RuleExpressionType = RuleExpressionType.LambdaExpression;
rules.Add(rule);
var workflows = new List<Workflow>();
Workflow exampleWorkflow = new Workflow();
exampleWorkflow.WorkflowName = "Example Workflow";
exampleWorkflow.Rules = rules;
workflows.Add(exampleWorkflow);
var bre = new RulesEngine.RulesEngine(workflows.ToArray());
想要深入了解RulesEngine如何使用,请查看官方Wiki的Getting Started页面,里面有详细的实例演示。同时,你还可以通过我们提供的Demo应用来实现快速上手。
它是如何工作的
其他亮点
值得一提的是,除了基本的使用方法,RulesEngine还支持结合Entity Framework使用,同时也有基于Blazor的RulesEngine 编辑器,你可以通过
https://github.com/alexreich/RulesEngineEditor
查看更多信息。甚至还支持安装为PWA,实现离线使用。
结语
.NET的朋友们,是时候让自己的应用更加灵活和强大了。抓住规则引擎RulesEngine,抽象你的业务逻辑,享受编程带来的便利吧!