2011-06-22 90 views
5

我的.NET應用程序在運行時評估用戶定義的規則。這些規則由用戶通過GUI菜單輸入到系統中。我生成一個對應於它的邏輯語句並將其存儲在數據庫中。規則引擎 - 如何存儲規則以避免在編輯時解析?

例如:(名稱=「約翰」和姓=「史密斯」)或號碼> 12

然而,當用戶想要編輯的GUI的規則,我需要做一個反向操作,以確定菜單狀態來自存儲的規則,這是昂貴且複雜的。您如何建議以一種可輕鬆顛倒菜單狀態的方式存儲規則?

+1

這將取決於您支持的規則以及給用戶多大的靈活性。 –

+2

如果您的規則很複雜,那麼實施一個建立的業務規則引擎而不是自己編寫規則管理是有意義的。規則比簡單的GUI菜單和動態語句生成要多得多。 – Kizz

回答

5

您可以存儲規則AST秒 - 執行代表樹的節點幾類:

interface INode 
{ 
} 

enum BinaryOperator 
{ 
    AND, OR, Equal, Greater, Lower; 
} 

class BinaryExpression : INode 
{ 
    BinaryOperator Operator { get; set; } 
    INode Left { get; set; } 
    INode Right { get; set; } 
} 

class PropertyRerefence : INode 
{ 
    string PropertyName { get; set; } 
} 

class Constant : INode 
{ 
    string Value { get; set; } 
} 

爲你的榜樣樹應該是這樣的:

BinaryExpression(OR) 
    Left=BinaryExpression(AND) 
      Left=... 
      Right=... 
    Right=BinaryExpression(Greater) 
      Left=PropertyReference("Number") 
      Right=Constant("12") 

你然後可以使用序列化(如果您不關心數據庫中的可讀性,最好使用JSON或XML,甚至可能使用二進制)來保存這些樹。在反序列化中,您不需要執行任何解析並可以遍歷樹來填充菜單。打印「(Name ='John'AND Surname ='Smith')OR Number> 12」也很容易,當你有AST時 - 對於BinaryExpression:print Left,print Operator,print Right。

你說你已經完成了評估,所以我會放棄這一點。你也可以看看this question