2011-06-22 7 views
5

Mi aplicación .NET evalúa las reglas definidas por el usuario en el tiempo de ejecución. Estas reglas se ingresan al sistema a través de menús GUI por usuario. Genero una declaración lógica que le corresponde y la almaceno en la base de datos.Rule Engine: ¿cómo almacenar reglas para evitar el análisis en la edición?

Por ejemplo: (Nombre = 'John' y apellidos = 'Smith') o número> 12

Sin embargo, cuando el usuario quiere editar una regla por la interfaz gráfica de usuario, que necesita para hacer una operación inversa para determinar los estados del menú de la regla almacenada, que es costoso y complejo. ¿Cómo recomendaría almacenar las reglas de una manera que se pueda revertir a los estados del menú fácilmente?

+1

Eso dependerá en gran medida de las reglas que admita y de la flexibilidad que le dé al usuario. –

+2

Si sus reglas son complicadas, tiene sentido implementar un motor de reglas de negocio establecido en lugar de usted mismo. MUCHO más para las reglas que los simples menús de la GUI y la generación de declaraciones dinámicas. – Kizz

Respuesta

5

Se podría almacenar las reglas que AST s - aplicar unas pocas clases que representan los nodos del árbol:

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; } 
} 

El árbol por su ejemplo sería el siguiente:

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

Usted podría entonces utilizar la serialización (mejor JSON o XML, quizás incluso binario si no le importa la legibilidad en el db) para guardar dichos árboles. En la deserialización, no necesita hacer ningún análisis sintáctico y puede atravesar el árbol para rellenar los menús.

Impresión "(Nombre = 'John' AND Apellido = 'Smith') O Número> 12" también es fácil cuando tiene AST - para una Expresión Binaria: imprimir Izquierda, imprimir Operador, imprimir Derecha.

Usted dice que ya tiene la evaluación implementada, así que lo omitiré. También puede mirar this question.

Cuestiones relacionadas