Kennt jemand eine gute .NET-Bibliotheksregelbibliothek (idealerweise Open Source)? Ich brauche etwas, das verschachtelte logische Ausdrücke ausführen kann, z. B. (A UND B) UND (B ODER C ODER D). Ich muss Vergleiche von Objekteigenschaften durchführen, z. B. A.P1 UND B.P1. (Idealerweise könnte ich jede Eigenschaft vergleichen - A.P1 UND B.P2).
Es sollte die Regeln in einer Datenbank speichern (ich habe eine Menge einfacher konfigurierbarer Logik). Und es sollte eine API zum Erstellen / Verwalten von Regeln haben. Das Verwaltungstool müsste die Instanzen überprüfen, um festzustellen, welche Eigenschaften verfügbar sind und welche Einschränkungen bestehen.
Vielen Dank!
Oh, noch eine Sache. Als Regel-Engine muss ich das Konzept der Aktionen (Befehle) einbeziehen. Diese werden ausgeführt, wenn der Ausdruck zurückgegeben wird:
If (expression.Evaluation) { actions.Execute(); }
Ich sehe eine Regel als etwas wie:
class Rule
{
Expression Exp;
Actions[] Actions;
Run()
{
if(Exp.Evaluate())
{
foreach(action in Actions)
{
action.Execute();
}
}
}
}
Hier ist eine Klasse, die ich in der Vergangenheit verwendet habe. Es wertet Strings genau wie eval () in Javascript aus.
String result = ExpressionEvaluator.EvaluateToString("(2+5) < 8");
Alles, was Sie tun müssen, ist eine Zeichenfolge zu erstellen, die aus Ihren Geschäftsobjekten ausgewertet werden soll. Dadurch werden alle komplizierten verschachtelten Logiken usw. erledigt.
using System; using System.CodeDom.Compiler; using System.Globalization; using System.Reflection; using Microsoft.JScript; namespace Common.Rule { internal static class ExpressionEvaluator { #region static members private static object _evaluator = GetEvaluator(); private static Type _evaluatorType; private const string _evaluatorSourceCode = @"package Evaluator { class Evaluator { public function Eval(expr : String) : String { return eval(expr); } } }"; #endregion #region static methods private static object GetEvaluator() { CompilerParameters parameters; parameters = new CompilerParameters(); parameters.GenerateInMemory = true; JScriptCodeProvider jp = new JScriptCodeProvider(); CompilerResults results = jp.CompileAssemblyFromSource(parameters, _evaluatorSourceCode); Assembly assembly = results.CompiledAssembly; _evaluatorType = assembly.GetType("Evaluator.Evaluator"); return Activator.CreateInstance(_evaluatorType); } /// <summary> /// Executes the passed JScript Statement and returns the string representation of the result /// </summary> /// <param name="statement">A JScript statement to execute</param> /// <returns>The string representation of the result of evaluating the passed statement</returns> public static string EvaluateToString(string statement) { object o = EvaluateToObject(statement); return o.ToString(); } /// <summary> /// Executes the passed JScript Statement and returns the result /// </summary> /// <param name="statement">A JScript statement to execute</param> /// <returns>The result of evaluating the passed statement</returns> public static object EvaluateToObject(string statement) { lock (_evaluator) { return _evaluatorType.InvokeMember( "Eval", BindingFlags.InvokeMethod, null, _evaluator, new object[] { statement }, CultureInfo.CurrentCulture ); } } #endregion } }
quelle
Keine der Open-Source-.NET-Regel-Engines unterstützt das Speichern von Regeln in der Datenbank. Die einzigen, die die Regeln in einer Datenbank gespeichert haben, sind kommerzielle. Ich habe einige Benutzeroberflächen für benutzerdefinierte Regelengines erstellt, die von der Datenbank ausgeführt werden. Die Implementierung kann jedoch nicht trivial sein. Dies ist normalerweise der Hauptgrund, warum Sie diese Funktion nicht kostenlos sehen.
Soweit ich weiß, wird keiner von ihnen alle Ihre Kriterien erfüllen, aber hier ist eine Liste derjenigen, von denen ich weiß:
Am einfachsten ist SRE
http://sourceforge.net/projects/sdsre/
Eine mit Regelverwaltungs-Benutzeroberfläche ist NxBRE
http://www.agilepartner.net/oss/nxbre/
Drools.NET verwendet JBOSS-Regeln
http://droolsdotnet.codehaus.org/
Ich persönlich habe keines von ihnen verwendet, weil alle Projekte, mit denen ich zusammengearbeitet habe, nie etwas Eigenes verwenden wollten. Die meisten Unternehmen denken, dass dies ziemlich einfach ist, verschwenden jedoch zu viel Zeit beim Codieren und Implementieren. Dies ist einer der Bereiche, für die das NIH-Syndrom (Not Invented Here Syndrome) gilt.
quelle
Da logische Ausdrücke nur eine Teilmenge des mathematischen Ausdrucks sind, sollten Sie NCalc - Mathematical Expressions Evaluator für .NET unter CodePlex ausprobieren .
quelle
Die offizielle MS-Lösung hierfür ist Windows Workflow . Obwohl ich es nicht "einfach" nennen würde, erfüllt es alle Ihre Spezifikationen (für deren Erfüllung ohnehin ein umfangreiches Framework erforderlich wäre).
quelle
Ich habe dieses http://www.codeproject.com/KB/recipes/Flee.aspx in der Vergangenheit mit Erfolg verwendet. Versuche es.
quelle
Windows Workflow Foundation bietet Ihnen eine kostenlose Inferenz-Engine für die Vorwärtsverkettung. Und Sie können es ohne den Workflow-Teil verwenden. Das Erstellen und Bearbeiten von Regeln ist für Entwickler in Ordnung.
Wenn Sie möchten, dass Nicht-Programmierer die Regeln bearbeiten und pflegen, können Sie den Regel-Manager ausprobieren .
Der Regel-Manager generiert eine funktionierende Visual Studio-Lösung für Sie. Damit sollten Sie ziemlich schnell loslegen. Klicken Sie einfach auf Datei \ Exportieren und wählen Sie das WFRules-Format aus.
quelle
Sie können sich auch unser Produkt unter http://www.FlexRule.com ansehen
FlexRule ist ein Business Rule Engine-Framework mit Unterstützung für drei Engines. Prozedurale Engine, Inferenz-Engine und RuleFlow-Engine. Die Inferenz-Engine ist eine Vorwärtsverkettungs-Inferenz, die eine verbesserte Implementierung des Rete-Algorithmus verwendet.
quelle
Ich würde mir Windows Workflow ansehen. Regel-Engines und Workflows starten in der Regel einfach und werden immer komplexer. So etwas wie Windows Workflow Foundation ist zunächst nicht allzu schwierig und bietet Raum für Wachstum. Hier ist ein Beitrag, der zeigt, dass es nicht allzu schwierig ist, eine einfache Workflow-Engine zum Laufen zu bringen.
quelle
Vielleicht schauen Sie sich SmartRules an . Es ist nicht kostenlos, aber die Oberfläche sieht einfach genug aus.
Ich weiß es nur, weil ich von dort zuvor das Dienstprogramm SmartCode codegen verwendet habe.
Hier ist eine Beispielregel von der Website:
BUSINESS RULES IN NATURAL LANGUAGE Before If (Customer.Age > 50 && Customer.Status == Status.Active) { policy.SetDiscount(true, 10%); } After (with Smart Rules) If Customer is older than 50 and the Customer Status is Active Then Apply 10 % of Discount
quelle
Sie können eine RuEn verwenden, eine einfache, von mir erstellte Open Source-Attribut-basierte Regel-Engine:
http://ruen.codeplex.com
quelle
Probieren Sie http://rulesengine.codeplex.com/ aus.
Es ist eine C # Open-Source-Regelengine, die mit Ausdrucksbäumen funktioniert.
quelle
Schauen Sie sich Logician an: Tutorial / Übersicht über CodeProject
Projekt: Seite / Quelle auf SourceForge
quelle
Je nachdem, was Sie mit Lambda-Ausdrücken (und Ausdrucksbäumen) versuchen, kann dies für dieses Konzept funktionieren. Im Wesentlichen stellen Sie einen Ausdruck als Zeichenfolge bereit, die dann im laufenden Betrieb zu einem Lambda-Ausdruck / Ausdrucksbaum kompiliert wird, den Sie dann ausführen (auswerten) können. Es ist zunächst nicht einfach zu verstehen, aber wenn Sie es einmal getan haben, ist es extrem leistungsfähig und ziemlich einfach einzurichten.
quelle
Es ist nicht kostenlos, da Sie es nicht einfach von seiner BizTalk-Abstammung trennen können, aber die Business Rules Engine-Komponenten von BizTalk sind eine separate Einheit von der BizTalk-Kern-Engine selbst und umfassen eine sehr leistungsstarke Regel-Engine, die eine auf Regeln / Richtlinien basierende Engine enthält GUI. Wenn es eine kostenlose Version davon gäbe, würde sie Ihren Anforderungen entsprechen (der Kauf von BizTalk nur für das BRE würde kommerziell nicht wirklich funktionieren.)
quelle