當前位置: 妍妍網 > 碼農

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

2024-01-28碼農

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