『.NET 高手必備』深入淺出RulesEngine:業務邏輯抽象新利器!

2024年2月6日 22点热度 0人点赞

親愛的朋友們,今天我要和大傢探討一款強大的業務規則庫——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,抽象你的業務邏輯,享受編程帶來的便利吧!