规则引擎 - 如何存储规则以避免在编辑时进行解析?

Ahm*_*tun 5 .net sql rule-engine rule business-rules

我的.NET应用程序在运行时评估用户定义的规则.这些规则由用户通过GUI菜单输入系统.我生成一个与之对应的逻辑语句并将其存储在数据库中.

例如:( Name ='John'AND Surname ='Smith')或Number> 12

然而,当用户想要通过GUI编辑规则时,我需要进行反向操作以从存储的规则确定菜单状态,这是昂贵且复杂的.您如何建议以一种可以轻松转换为菜单状态的方式存储规则?

Mar*_*cek 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; }
}
Run Code Online (Sandbox Code Playgroud)

您的示例的树将如下所示:

BinaryExpression(OR)
  Left=BinaryExpression(AND)
          Left=...
          Right=...
  Right=BinaryExpression(Greater)
          Left=PropertyReference("Number")
          Right=Constant("12")
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用序列化(最好的JSON,或XML,如果您不关心数据库中的可读性,甚至可能是二进制)来保存这些树.在反序列化时,您不需要进行任何解析,并且可以遍历树以填充菜单.

当你有AST时,打印"(Name ='John'和Surname ='Smith')或者数> 12"也很容易 - 对于BinaryExpression:打印左,打印操作员,打印右.

你说你已经实施了评估,所以我会把它留下来.你也可以看看这个问题.