WWF規則引擎ruleEngine的一個開發例子

這兩天寫一個研究性的材料,主要是關於基於規則驅動的業務開發,於是找了相關資料來看,以下是一篇我認爲結合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的計算也是有特點的:根據優先級和判斷條件的“關聯性”在運行時來重新計算。重新計算的含義是,從優先級最高的依次在計算一次,而不是計算完關聯之後回到原點繼續計算
     舉個例子,現在有這麼四個條件判斷  
 Rule4 (Priority = 4)

   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:隱式表達式。
隱式表達就是不指名條件變量之間的關係,直接寫。比如           

    Rule1    if( A=3)
               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:

Rule1
if(A=2)
  F1()

Rule2
  if(B=2)
   c=5

[RuleWrite("B")]
F1()
{
  B=2;
}

    如果調用還要複雜,F1又調用另外一個函數F2,F2才真正修改B的話,就得使用RuleInvoke屬性了,比如
 

Rule 1
  if(A=2)
    F1()
Rule 2
   if(B=2)
     c=5;

[RuleInvoke("F2")]
F1()
{
  F2();
}


[RuleWrite("B")]
F2()
{
  B=2;
}

至於Expicit顯式方式聲明,可以用前兩種來組合實現,一般用到的較少。Expicit使用Update()方法來更新變量的值。


發佈了24 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章