Ahm*_*tun 5 .net sql rule-engine rule business-rules
我的.NET应用程序在运行时评估用户定义的规则.这些规则由用户通过GUI菜单输入系统.我生成一个与之对应的逻辑语句并将其存储在数据库中.
例如:( Name ='John'AND Surname ='Smith')或Number> 12
然而,当用户想要通过GUI编辑规则时,我需要进行反向操作以从存储的规则确定菜单状态,这是昂贵且复杂的.您如何建议以一种可以轻松转换为菜单状态的方式存储规则?
您可以将规则存储为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:打印左,打印操作员,打印右.
你说你已经实施了评估,所以我会把它留下来.你也可以看看这个问题.
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |