2011-06-22 11 views
5

Moja aplikacja .NET ocenia reguły zdefiniowane przez użytkownika w środowisku wykonawczym. Reguły te są wprowadzane do systemu za pośrednictwem menu GUI według użytkownika. Generuję logiczną instrukcję, która odpowiada i zapisuje ją w bazie danych.Rule Engine - jak przechowywać reguły, aby uniknąć parsowania na edycji?

na przykład: (name = „John” i nazwisko = „Kowalski”) lub numer>, gdy użytkownik chce edytować regułę Gui, potrzebuję 12

Jednak aby dokonać operacji odwrotnej do określenia menu stwierdza z zapisanej reguły, która jest kosztowna i złożona. Jak poleciłbyś przechowywać reguły w taki sposób, aby łatwo można było odwrócić je do stanów menu?

+1

To zależy w dużej mierze od zasad, które obsługujesz i od tego, jaką elastyczność dajesz użytkownikowi. –

+2

Jeśli Twoje reguły są skomplikowane, warto wdrożyć ustalony mechanizm reguł biznesowych zamiast samodzielnego kodowania reguł. Jest DUŻO więcej reguł niż proste menu GUI i dynamiczne generowanie instrukcji. – Kizz

Odpowiedz

5

Można przechowywać zasady jak AST s - wdrożyć kilka klas, które reprezentują węzły drzewa:

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

Drzewo dla przykładu wyglądałby następująco:

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

Ty może następnie użyć serializacji (najlepiej JSON lub XML, może nawet binarny, jeśli nie zależy Ci na czytelności w db), aby zapisać takie drzewa. Podczas deserializacji nie trzeba wykonywać żadnych analiz i można przechodzić przez drzewo w celu zapełnienia menu.

Drukowanie "(Imię =" John "ORAZ nazwisko =" Smith ") LUB Numer> 12" jest również łatwe, gdy masz AST - dla BinaryExpression: wydrukuj w lewo, wydrukuj Operator, wydrukuj w prawo.

Mówisz, że masz już zaimplementowaną ocenę, więc zostawię to. Możesz również spojrzeć na this question.

Powiązane problemy