規則引擎
規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現了將業務決策從應用程序代碼中分離出來,並使用預定義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,並根據業務規則做出業務決策。
個人理解
變化點過於集中在一點,為了適應變化,而給各種場景分別寫了各自關於那點的代碼邏輯,盡管主要的業務邏輯相同。
適用點舉例
計算折扣,需要根據客戶的積分決定打折點
工作流具體節點的路由控制
其他(希望大家補充下,想象力有限...)
用法
以計算客戶打折點為例:
我們首先得新建一個規則文件,用來定義各個場景對應的折扣計算方式,如下:
#region 折扣規則 //這個是規則名稱,在C#代碼中會使用到這個名稱,此處為"折扣規則" rule default //默認規則,必須存在,如果C#代碼中指定的子規則名稱沒有找到,則默認應用default規則(有開關能設置如沒有找到子規則是否報錯) return 1; end rule rule A公司 //子規則名稱,此處為"A公司" if(customerScore>=0&&customerScore<100) return 1; if(customerScore>=100&&customerScore<300) return 0.8; return 0.5; end rule rule B公司 //子規則名稱,此處為"B公司" if(customerScore>=0&&customerScore<100) return 0.9; if(customerScore>=100&&customerScore<300) return 0.7; return 0.6; end rule #endregion
C#代碼中,分幾種情況 - 我就想調用默認規則:
var result = REngine.InvokeAsFloat("折扣規則", REngine.CreateParameter("customerScore", 220));
我想根據公司名稱來調用折扣規則:
var result1 = REngine.InvokeAsFloat("折扣規則", "A公司", REngine.CreateParameter("customerScore", 220)); var result2 = REngine.InvokeAsFloat("折扣規則", "B公司", REngine.CreateParameter("customerScore", 220)); var companyId="A公司";//這里表示公司名來自變量 var result3 = REngine.InvokeAsFloat("折扣規則", companyId, REngine.CreateParameter("customerScore", 220));
很方便,簡直太方便了。
那如果我根據companyId查找的子規則名稱不存在,怎么辦?我就想要具體的子規則決定規則,而不想要根據默認default規則,那該如何是好?別急,請看:
<appSettings> <add key="REngine.RulefilesPath" value="rules"/> <add key="REngine.ThrowExceptionIfNotfoundRule" value="1"/> </appSettings>
如果配置文件中設置了REngine.ThrowExceptionIfNotfoundRule參數為1,則代表如果沒有找到具體子規則名,就會報錯,不會應用默認default規則
介紹下REngine的API
性能
項目地址
REngine地址:https://github.com/daibinhua888/REngine