国产拍揄自揄免费观看-国产精品永久免费视频-亚洲国产成人片在线观看无码-国产精品久久久久9999高清

行業(yè)動態(tài)

.Net Core 環(huán)境下構建強大且易用的規(guī)則引擎

2018-06-11 08:43:00 小沐管家 0

1. 引言

1.1 為什么需要規(guī)則引擎

在業(yè)務的早期時代,也許使用硬編碼或者邏輯判斷就可以滿足要求。但隨著業(yè)務的發(fā)展,越來越多的問題會暴露出來:

  • 邏輯復雜度帶來的編碼挑戰(zhàn),需求變更時改變邏輯可能會引起災難

  • 重復性的需求必須可重用,否則必須重復性編碼

  • 運行期間無法即時修改規(guī)則,但重新部署可能會帶來其他問題

  • 上線前的測試變得繁瑣且不可控,必須花大量的人力和時間去測試

這些困境在『 小明歷險記:規(guī)則引擎 drools 教程一』 一文中可以體會一番,一開始只是簡單的根據(jù)購物金額來發(fā)放積分,運行期間又要更改為更多的規(guī)則層次,如果不及時引入對應的規(guī)范化處理機制,開發(fā)人員將慢慢墜入無止盡的業(yè)務深淵。對此,聰明的做法是在系統(tǒng)中引入規(guī)則引擎,對業(yè)務操作員要提供盡量簡單的操作頁面來配置規(guī)則,規(guī)則引擎和配置盡量不要耦合到一塊。

1.2 .Net Core 環(huán)境下的選擇 -- Nrules

目前最流行的規(guī)則引擎應該是Drools, 用 Java 語言編寫的開放源碼規(guī)則引擎,使用 Rete 算法對所編寫的規(guī)則求值,其操作流程如下:

沐歌環(huán)保

對于 .Net 應用來說,可以通過 Kie 組件提供的 Rest 接口調用規(guī)則引擎運算。然而其過于龐大,僅僅只是需要規(guī)則引擎計算核心的部分。對此,查找了 .Net 中開源的規(guī)則引擎,發(fā)現(xiàn)只有同樣實現(xiàn) Rete 算法的 Nrules 滿足要求(支持 .Net Core,運行時加載規(guī)則引擎)。

注:本文參考借鑒了美團技術團隊 從 0 到 1:構建強大且易用的規(guī)則引擎 一文的設計思路,對 Drools 從入門到放棄。

2. Nrules 實戰(zhàn) -- 電商促銷活動規(guī)則引擎設計

2.1 了解 Nrules

NRules 是基于 Rete 匹配算法的.NET 生產(chǎn)規(guī)則引擎,基于.NET Standard ,支持 4.5+ 的應用,提供 流式聲明規(guī)則、運行時構建規(guī)則、專門的規(guī)則語言(開發(fā)中,不推薦使用到生產(chǎn),基于.Net 4.5 而不是 .NETStandard )。
其計算機制也與其他規(guī)則引擎大同小異:
沐歌環(huán)保

2.2 設計規(guī)則配置

前文提到 對業(yè)務操作員要提供盡量簡單的操作頁面來配置規(guī)則 ,所以我們定義促銷活動的規(guī)則配置就要盡量簡單。

沐歌環(huán)保

在設計模型時,我們必須先參考現(xiàn)實生活中遇到的電商促銷活動,大致可以想到有這么幾種活動類型:滿減促銷、單品促銷、套裝促銷、贈品促銷、滿贈促銷、多買優(yōu)惠促銷、定金促銷等。
在這里,我選擇對多買優(yōu)惠促銷做分析,多買促銷優(yōu)惠即所謂的階梯打折,如買一件9折,買兩件8折,其模型大致如下:

沐歌環(huán)保

這里為了簡化設計,設計的模型并不會去約束平臺、活動范圍、會員等級等,僅僅約束了使用的產(chǎn)品 id 范圍。為了匹配現(xiàn)實中可能出現(xiàn)的組合優(yōu)惠(類似滿減活動后還可以使用優(yōu)惠券等)現(xiàn)象和相反的獨斥現(xiàn)象(如該商品參與xx活動后不支持X券),設置了一個字段來判斷是否可以組合優(yōu)惠,也可以理解為所有活動都為組合優(yōu)惠,只是有些組合優(yōu)惠只有一個促銷活動。

注:想了解更多關于電商促銷系統(tǒng)設計可參考腦圖

2.3 規(guī)則配置轉換

為了實現(xiàn) 規(guī)則引擎和配置盡量不要耦合到一塊,必須有中間層對規(guī)則配置進行轉換為 Nrules 能夠接受的規(guī)則描述。聯(lián)系前文的計算機制,我們可以得到這樣一個描述模型:

沐歌環(huán)保

由于 Nrules 支持流式聲明,所以約束條件和產(chǎn)生的結果都可以用 LambdaExpression 表達式實現(xiàn)。現(xiàn)在我們需要把階梯打折的配置轉換成規(guī)則描述,那我們需要先分析一下。假設滿一件9折,滿兩件8折,滿三件7折,那我們可以將其分解為:

  • 大于等于三件打 7 折

  • 大于等于兩件且小于三件打 8 折

  • 大于等于一件且小于兩件 9 折

基于此分析,我們可以看出,只有第一個最多的數(shù)量規(guī)則是不一樣的,其他規(guī)則都是比前一個規(guī)則的數(shù)量小且大于等于當前規(guī)則的數(shù)量,那么我們可以這樣轉換我們的規(guī)則配置:

沐歌環(huán)保

2.4 生成規(guī)則集合

在 Nrules 的 wiki 中,為了實現(xiàn)運行時加載規(guī)則引擎,我們需要引入實現(xiàn) IRuleRepository ,所以我們需要將描述模型轉換成 Nrules 中的 RuleSet:

沐歌環(huán)保

2.5 執(zhí)行規(guī)則引擎

做了轉換處理僅僅是第一步,我們還必須創(chuàng)建一個規(guī)則引擎的處理會話,并把相關的事實對象(fact)傳遞到會話,執(zhí)行觸發(fā)的代碼,相關對象發(fā)生了變化,其簡單代碼如下:

沐歌環(huán)保

2.6 應用場景示例

我們假設有這么一個應用入口:傳入一個購物車(這里等價于訂單)id,獲取其可以參加的促銷活動,返回對應活動優(yōu)惠后的結果,并按總價的最低依次升序,那么可以這么寫:

沐歌環(huán)保

假設這么一個購物車id,買一件時最優(yōu)惠是參加 A 活動,買兩件時最優(yōu)惠是參加 B 和 C 活動,那么其效果圖可能如下:

沐歌環(huán)保

3. 結語

本文只是對規(guī)則引擎及 Nrules 的簡單介紹及應用,過程中隱藏了很多細節(jié)。在體會到規(guī)則引擎的強大的同時,還必須指出其局限性,規(guī)則引擎同樣不是銀彈,必須結合實際出發(fā)。

擴展閱讀:Martin Fowler:應該使用規(guī)則引擎嗎?

原文地址: https://www.cnblogs.com/chenug/p/9160397.html


? 主站蜘蛛池模板: 中文在线а√在线天堂中文| 国产精品无码一区二区在线看| 亚洲av无码无在线观看红杏| 四虎精品影院永久在线播放| 欧美日韩视频在线第一区| 国产av无码专区亚洲awww| 伴郎粗大的内捧猛烈进出视频观看 | 无码一区二区波多野结衣播放搜索| 亚洲中文字幕无码中文字在线| 国产真人作爱免费视频道歉 | 欧美巨鞭大战丰满少妇| 校花高潮抽搐冒白浆视频| 亚洲色欲一区二区三区在线观看| 亚洲 欧美 综合 另类 中字| 国产呻吟久久久久久久92| 6080yyy午夜理论片中无码| 久久久久亚洲av无码尤物| 国产av无码专区亚洲av男同 | 日本高清www色视频| 国产亚洲精品aaaa片小说| 狠狠亚洲婷婷综合色香五月排名 | 8av国产精品爽爽ⅴa在线观看| 国产精品熟女视频一区二区| 一本一道精品欧美中文字幕| 中文无码精品a∨在线| 亚洲av无码av在线影院| 国产精品制服| 国产 麻豆 日韩 欧美 久久| 精品国偷自产在线| 上课忘穿内裤被老师摸到高潮| 亚洲精品无码不卡在线播放he| 精品亚洲国产成人蜜臀av| 成熟女人特级毛片www免费| 久久人人玩人妻潮喷内射人人| 国产suv精品一区二区883| 特级欧美午夜aa片| 久久99精品久久久久久9| 成人免费视频视频在线观看 免费| 精品无码久久久久久久久| 中文字幕无码免费久久9一区9 | 毛片a级毛片免费观看|