這兩天寫一個研究性的材料,主要是關於基於規則驅動的業務開發,於是找了相關資料來看,以下是一篇我認爲結合MS的WWF中ruleEngine,講得很通俗易懂的,關於規則的原理和實現邏輯的文章。看完後,基本能對規則的實現原理和適用場景有一個概要的認識,轉過來,便於收藏。
原文地址如下:
http://www.csharpwin.com/csharpspace/2673.shtml
工作流中的RuleEngine是非常重要的一塊功能,主要用來計算一些表達式的真假值。
其他一些工作流中一般是使用外掛的一些RuleEngine,或者自己實現自己的特定的Engine。
WWF中集成了一個功能強大的RuleEnggine。這裏是英文文章原文:http://msdn.microsoft.com/windowsvista/default.aspx?pull=/library/en-us/dnlong/html/intWF_FndRlsEng.asp
WWF中有兩類規則:Condition和Forward Chaining。
1:Condition
Condtion是一種簡單的邏輯表達式,比如“if (a>5) then b=6;”
Condtion一般用在IfElseBranch;While;Replicator;Condition Activety Group中
Condtion有兩種表達方式,其一是CodeCondtion,顧名思義,就是自己寫判斷代碼;其二是RuleCondtionRefernce,定義在一個xml文件中(xxx.Rules文件)。建議使用第二種,因爲這種邏輯可以隨時修改。這是一個Rule的xml文件的例子
RuleSet是一組Rule的集合。不同的是,這些Rule是有優先級(Priority)的。可以用在諸如FilterPolicy中。
RuleSet的這些Rule的計算也是有特點的:根據優先級和判斷條件的“關聯性”在運行時來重新計算。重新計算的含義是,從優先級最高的依次在計算一次,而不是計算完關聯之後回到原點繼續計算。
舉個例子,現在有這麼四個條件判斷
IF A = 15
THEN B = 5
Rule3 (P=3)
IF C = 5
THEN B = 10
Rule2 (P=2)
IF D = 2
THEN A = 15
Rule1 (P=1)
IF B = 5
THEN E = 7
初始數據如下:
- A = 0
- B = 0
- C = 5
- D = 2
- E = 0
運行之後,結果如下:
- A = 15
- B = 5
- C = 5
- D = 2
- E = 7
運行邏輯是這樣的:首先執行Rule4,不符合;執行Rule3,設置B=10;執行Rule2,設置A=15;因爲A的值已經改變,所以重新返回Rule4,執行設置B=5;依次檢查都不符合條件;執行Rule1,設置E=7。
2:ForwardChaining
這一個有三種方式:Inplicit;Attributed-Based;Explicit
Inplicit:隱式表達式。隱式表達就是不指名條件變量之間的關係,直接寫。比如
B=2;
Rule2 if(B=2)
C=4;
Rule2中的條件變量B就是隱式的和Rule1有關的。每當Rule1執行設置B的值的時候,Rule都需要重新計算。這一寫都是自動完成的。
Attributed-Based:通過屬性來標明哪些是對條件表達式的修改。屬性有三種:RuleRead,RuleWrite,RuleInvoke。
比如,上邊的例子中,如果Rule1中不是直接設置B=2,而是調用一個函數F1,F1設置了B的值,那麼,我們就需要給F1一個屬性RuleWrite:
if(A=2)
F1()
Rule2
if(B=2)
c=5
[RuleWrite("B")]
F1()
{
B=2;
}
如果調用還要複雜,F1又調用另外一個函數F2,F2才真正修改B的話,就得使用RuleInvoke屬性了,比如
if(A=2)
F1()
Rule 2
if(B=2)
c=5;
[RuleInvoke("F2")]
F1()
{
F2();
}
[RuleWrite("B")]
F2()
{
B=2;
}
至於Expicit顯式方式聲明,可以用前兩種來組合實現,一般用到的較少。Expicit使用Update()方法來更新變量的值。