.Net規則引擎介紹 - 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

 

性能

 

項目地址

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM