Suche nach einer einfachen Regel-Engine-Bibliothek in .NET [geschlossen]

68

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(); 
            }
        } 
    }
}
Kurtz
quelle

Antworten:

46

Wenn ich mit dem Willen einverstanden bin, würde ich sagen, dass Sie etwas aus der Workflow-Engine-Familie verwenden, obwohl kein Workflow. Untersuchen Sie den System.Workflow.Activities.Rules- Namespace ein wenig - er wird in .Net 3 unterstützt und in .Net3.5 integriert. Sie haben alles kostenlos zur Hand, wie Sie bereits erwähnt haben:

  • RuleCondition für Bedingungen, RuleAction für Aktionen

  • standardisiertes Format zur Beschreibung von Metacode (CodeDom - CodeExpressions)

  • Sie können jede Art von Komplexität über TypeProviders in diese einbinden (um die Wahrheit zu sagen, außer Linq und Lambdas und damit Erweiterungsmethoden)

  • Es gibt einen eingebauten Editor für die Regelbearbeitung mit Intellisense

  • Da die Regel serialisierbar ist, kann sie leicht beibehalten werden

  • Wenn Sie die Regeln über ein Datenbankschema verwenden möchten, können Sie sie auch über den Typprovider implementieren

Für den Anfang: Verwenden von Regeln außerhalb eines Workflows

Ps.: Wir verwenden es ausgiebig und es gibt viel mehr in diesem Namespace, als Sie sich jemals vorstellen -> eine vollständige Meta-Algorithmus-Sprache

Und das Wichtigste: Es ist einfach zu bedienen - wirklich

Nicolai Ustinov
quelle
1
Toller Beitrag, das haben wir in der Vergangenheit verwendet und fanden es ziemlich mächtig, den Teil der Regel-Engine außerhalb des gesamten Windows-Workflow-Frameworks zu nutzen.
Brian Scott
18

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
  }    
}
Shaun Bowe
quelle
2
Ich habe Ihren Code in meiner Web-App ausprobiert. Leider funktioniert die dynamische Kompilierung mit Webanwendungen aufgrund von Berechtigungen für den Ordner "asp temp" nicht.
8

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.

Hector Sosa Jr.
quelle
2
Drools.NET ist keine gute Idee, hängt von einer JVM-Implementierung in .Net ab, die sich noch in der Beta befindet, hat es ausprobiert und ist meiner Meinung nach wirklich nicht produktionsbereit.
pmlarocque
1
Hat hier jemand SRE benutzt? Was war die Erfahrung?
Kurtz
7

Da logische Ausdrücke nur eine Teilmenge des mathematischen Ausdrucks sind, sollten Sie NCalc - Mathematical Expressions Evaluator für .NET unter CodePlex ausprobieren .

James Curran
quelle
Hey, das ist eigentlich ziemlich ordentlich. Obwohl ich anhand der Beispiele denke, dass es eine elegantere Möglichkeit geben könnte, Delegatenausdrücke zu bewerten. Dies könnte ein Erweiterungspunkt sein, um eine Reflexion über die Ausdrucksoperanden einzufügen.
Kurtz
5

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
Die aktuelle WF-Regelengine hat einen Nachteil ... Sie verwendet eine sehr kleine Teilmenge von Codedom-Ausdrücken, analysiert jedoch tatsächlich Zeichenfolgen, um den zugrunde liegenden Code zu generieren - nicht die CodeDom-Klassen.
Scott Dorman
Anfangs habe ich Drools 3.0 verwendet. Aber .Net Framework 4.5 wird nicht unterstützt. Kann ich dies als Ersatz für Drools verwenden?
Shyam Dixit
@ShyamDixit: Sorry, keine Ahnung, aber ich würde alles über die aktuelle Entwicklung über WF3 auswählen. Diese Antwort ist fast sechs Jahre alt. Treffen Sie keine Entscheidungen, indem Sie alte Artikel / Fragen / Antworten lesen.
Das Parsen von Daten kann mit WF erfolgen oder nicht? @ Will
Shyam Dixit
@ShyamDixit: Ich würde es nicht empfehlen.
3

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.

Sentient
quelle
Dies ist ein verbesserter Serilizer für die WWF-Regel-Engine: github.com/chriseyre2000/perfectstorm/tree/master
Chriseyre2000
Der Link in der Antwort ist defekt, bitte aktualisieren
jayasurya_j
2

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.

Arash Aghlara
quelle
1

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
Brendan Kowitz
quelle
Jetzt verstorben. Versuchen Sie es woanders.
Firestrand
1

Sie können eine RuEn verwenden, eine einfache, von mir erstellte Open Source-Attribut-basierte Regel-Engine:

http://ruen.codeplex.com

Bhaskar
quelle
0

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.

Scott Dorman
quelle
Richtig, ich verstehe die Verwendung von Lambda-Ausdrücken und würde sie verwenden, wenn ich dies von Grund auf neu erstellen würde. Ich hoffe jedoch, dass der Mut dieser Bibliothek bereits vorhanden ist oder zusammengeschustert werden kann.
Kurtz
Nicht, dass ich wüsste ... es gibt mehrere Bibliotheken für Regelmodultypen, aber keine davon ist besonders einfach und / oder effizient und keine verwendet Lambda-Ausdrücke.
Scott Dorman
0

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.)

Hugo Rodger-Brown
quelle