.Net規則引擎介紹:REngine

6x7d 9年前發布 | 86K 次閱讀 REngine 業務規則引擎

規則引擎

規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現了將業務決策從應用程序代碼中分離出來,并使用預定義的語義模塊編寫業務決策。接受數據輸入,解釋業務規則,并根據業務規則做出業務決策。

個人理解

變化點過于集中在一點,為了適應變化,而給各種場景分別寫了各自關于那點的代碼邏輯,盡管主要的業務邏輯相同。

適用點舉例

計算折扣,需要根據客戶的積分決定打折點

工作流具體節點的路由控制

其他(希望大家補充下,想象力有限...)

用法

以計算客戶打折點為例:

我們首先得新建一個規則文件,用來定義各個場景對應的折扣計算方式,如下:

 
#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

.Net規則引擎介紹:REngine

性能

.Net規則引擎介紹:REngine

.Net規則引擎介紹:REngine

項目地址

REngine地址:https://github.com/daibinhua888/REngine

 本文由用戶 6x7d 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!