> 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