C 規則引擎RulesEngine

2022-01-09 21:11:17 字數 3297 閱讀 9637

當編寫應用程式時,經常性需要花費大量的時間與精力處理業務邏輯,往往業務邏輯的變化需要重構或者增加大量**,對開發測試人員很不友好。

之前在這篇文章說過,可以使用指令碼引擎來將我們需要經常變化的**進行動態編譯執行,自由度非常大,不過對應的需要資源也多。如果只是針對非常具體業務邏輯的變化,可以嘗試使用rulesengine對程式進行操作。

下文使用了官方示例且部分內容翻譯自說明文件

rulesengine是微軟推出的規則引擎,規則引擎在很多企業開發中有所應用,是處理經常變動需求的一種優雅的方法。個人任務,規則引擎適用於以下的一些場景:

rulesengine的規則使用json進行儲存,通過lambda表示式方式表述規則(rules)。

安裝很方便,直接使用nuget進行安裝:

install-pacakge rulesengine
需要有rules,有workflowname,然後還有一些屬性。

[

]}]

除了標準的ruleexpressiontype,還可以通過定義rules巢狀多個條件,下面是or邏輯。

,

]}

根據不同的客戶屬性,提供不同的折扣。由於銷售的情況變化較快,提供折扣的規則也需要經常變動。因此比較適用於規則引擎。

public void run()

....");

//建立輸入

var basicinfo = "";

var orderinfo = "";

var telemetryinfo = "";

var converter = new expandoobjectconverter();

dynamic input1 = jsonconvert.deserializeobject(basicinfo, converter);

dynamic input2 = jsonconvert.deserializeobject(orderinfo, converter);

dynamic input3 = jsonconvert.deserializeobject(telemetryinfo, converter);

var inputs = new dynamic

;//載入規則

var files = directory.getfiles(directory.getcurrentdirectory(), "discount.json", searchoption.alldirectories);

if (files == null || files.length == 0)

throw new exception("rules not found.");

var filedata = file.readalltext(files[0]);

var workflowrules = jsonconvert.deserializeobject>(filedata);

//初始化規則引擎

var bre = new rulesengine.rulesengine(workflowrules.toarray(), null);

string discountoffered = "no discount offered.";

//執行規則

listresultlist = bre.executeallrulesasync("discount", inputs).result;

//處理結果

resultlist.onsuccess((eventname) => % over mrp.";

});resultlist.onfail(() => );

console.writeline(discountoffered);

}

輸入一般來說是ienumerable或者是匿名型別,上面例項展示的是由json反序列化形成的dynamic型別,對於程式生成的資料,使用匿名型別更加方便。

var nestedinput = new ,

new listitem}}

};

和指令碼引擎一樣,預設規則引擎只能訪問system的命名空間。如果需要使用到稍微複雜一些的型別,可以自己定義型別或者函式。比如定義乙個這樣的函式:

public static class utils

}

需要使用的時候,先將類傳遞給rulesengine:

var resettingswithcustomtypes = new resettings  };

var engine = new rulesengine.rulesengine(workflowrules.toarray(), null, resettingswithcustomtypes);

然後就可以直接在表示式中使用了。

"expression": "utils.checkcontains(input1.country, \"india,usa,canada,france\") == true"
預設情況下,規則的輸入使用的是類似input1 input2這樣的形式,如果想直觀一點,可以使用ruleparameter來進行封裝具體的引數型別。

ruleparameter ruleparameter = new ruleparameter("nip", nestedinput);

var resultlist = bre.executeallrulesasync(workflow.workflowname, ruleparameter).result;

如果表示式比較複雜的情況下,可以使用本地變數來進行分段處理,這對除錯來說會比較方便。

本地變數的關鍵字為localparams,可以將中間的內容簡單理解成var name = expression

,,],

"expression": "(completedsecuritytrainings.any() && completedprojecttrainings.any()) || isrequestaccesssecured "

}

使用規則引擎,可以將經常變動的業務邏輯獨立摘出來,為我們編寫動態、可拓展的程式提供了很大的便利。rulesengine這個東西提供的api也比較簡潔,上手非常簡單。

mysql 規則引擎 為什麼使用規則引擎?

一天,朱斯參加了一場code review研討會。會上的一群人正在討論著如何對祖傳 進行變更,大家你一言,我一語,場面十分熱鬧!突然,只見人群中的乙個人滿面愁容,說道 昨天在專案中看到下面這樣一段 分支太多了!維護起來很煩啊!if day 周一 else if day 周二 else if day ...

規則引擎pyke

1.官網 2.安裝第三方包 pyenv global anaconda3 4.2.0 pip install htmltemplate 3.原始碼安裝pyke pyenv global anaconda3 4.2.0 cd pyke3 1.1.1 python setup.py build pyth...

規則引擎 easy rules

直接看官方的例子。經典的例子 大致的步驟 建立各種規則,即rule.可以通過 pojo 或 rulebuilder api 兩種方式建立。建立規則容器rules rules new rules 註冊建立的規則rules.add rule 建立流,即facts.流控制規則的引數輸入.facts fac...