> die Matches sind mir soweit klar.
> Wie würdest Du die AND/OR Verküpfung implementieren?
> Wo und wie würdest Du die Rekursion gestalten?

Pseudocode(Methodennamen der xml-API stimmen nicht etc.):

foreach (xmlnode rule in xmldoc.getNodes("/configuration/Rules/Rule")
{
        if(EvaluateNode(rule, "AND")) //implizites AND
        {
                schleife abbrechen und aktion aus rule anwenden.
        }
}

bool EvaluateNode(xmlnode node, string operator)
{
        bool ret = operator=="AND"? true : false;
        foreach (xmlnode subnode in node.children)
        {
                bool result;
                switch(subnode.nodename)
                {
                        case "Match":
                                result = EvaluateMatchNode(subnode);
//matches sind klar
                                break;
                        case "and":
                                result = EvaluateNode(subnode, "AND");
//rekursion
                                break;
                        case "or":
                                result = EvaluateNode(subnode, "OR");
//rekursion
                                break;
                }
                ret = operator=="AND"? ret&&result : ret||result;
        }
        return ret;
}


- Beim operator würde man natürlich lieber einen eigenen enum-typ
verwenden...
- Zur Optimierung kannst Du noch kurzschluss-AND/OR implementieren, d.h. bei
AND wird beim ersten ergebnis mit false abgebrochen und false zurückgegeben,
beim OR wird beim ersten true abgebrochen und true zurückgegeben, so dass
weniger matches ausgewertet werden müssen.
- Idee: <Match name="Cookies.Wert" ..> etc. => wenn nur ein einfacher Name
angegeben wird, wird im ganzen Request danach gesucht, ansonsten die
UnterCollections Cookies,Form,Headers,Querystring,ServerVariables, aber auch
Session etc..
<Match name="Session.UserType" type="string" value="Admin"/>
- Idee: Neuer type für direkte Vergleiche etc.
<Match name="Form.Passwort" type="operator:=="
value="Form.PasswortWiederholung"/>
- Eine weitere Optimierung: Du kannst so ne Art Vorkompilierung beim ersten
Laden der Rules machen (und diese cachen), indem Du Dir Hashtables
erstellst, die angeben welche regel was braucht und dann schlägst du nach
und kannst vielleicht von vornherein einige regeln ausschliessen, die du
nicht testen brauchst, weil einfach die nötigen parameter gar nicht aktuell
da sind. Bei der vorkompilierung musst Du aufpassen, dass nur wirklich
nötige parameter aufgenommen werden, wenn es also z.B. Ein OR gibt, wird der
parameter nur dann wirklich benötigt, wenn er in allen OR-Zweigen
vorkommt...


Gruss,

Claudius

_______________________________________________
Framework.net Mailingliste, Postings senden an:
Framework.net@glengamoi.com
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/framework.net

Antwort per Email an