68 votes

Recherche d'une bibliothèque de moteur de règles simple dans .NET

Personne ne sait de une bonne .NET le règlement de la bibliothèque la bibliothèque (idéalement open-source)? J'ai besoin de quelque chose qui peut faire imbriqués les expressions logiques, par exemple, (A ET B) ET (B ou C OU D). J'ai besoin de faire des comparaisons de propriétés de l'objet, par exemple, A. P1 ET B. P1. (Idéalement, je pourrais comparer à la propriété-A. P1 ET B. P2).

Il doit stocker les règles dans une base de données (j'ai beaucoup de simples logiques configurables). Et il devrait avoir une règle de création/gestion de l'API. L'outil de gestion devra inspecter les instances de déterminer les propriétés qui sont disponibles et qui il existe des contraintes.

Merci!


Oh, encore une chose. Des règles, moteur, j'ai besoin d'inclure le concept d'Actions (Commandes). Ce sont les exécuter quand l'expression renvoie:

Si (expression.D'évaluation) { actions.Execute(); }

Donc je vois une règle que quelque chose comme:

class Rule
{
Expression Exp;
Actions[] Actions;
Run() { if(Exp.Evaluate()) { foreach(action in Actions) { action.Execute() ; } } }
}

46voto

Nicolai Ustinov Points 456

D'accord avec je dirais quelque chose de l'utilisation du moteur de workflow famille, bien que pas de flux de travail. Examiner Le Système.Flux de travail.Les activités.Les règles de l'espace de Noms un peu - il est pris en charge .Net 3, et construit en .Net3.5. Vous avez tout en main pour libre d'utiliser comme vous l'avez dit :

  • RuleCondition pour les conditions , les RuleAction pour les actions

  • format standardisé pour les décrire metacode (CodeDom - CodeExpressions)

  • vous pouvez plugin tout type de complexité dans que (pour dire la vérité, à l'exception de Linq et les lambdas et donc de l'extension les méthodes de certains types) via TypeProviders

  • il y a une interface de l'éditeur de règle montage avec intellisense

  • comme la règle est sérialisable, il peut être facilement persisté

  • si vous utilisez les règles sur une base de données via typeprovider il peut être mis en œuvre trop

Pour un débutant : À l'aide de règles en dehors d'un flux de travail

Ps.: nous sommes en l'utilisant de manière intensive, et il y a beaucoup plus dans cet espace que vous ne l'imaginez -> une complète méta-algorithme de la langue

Et le plus important : il est facile à utiliser, vraiment

18voto

Shaun Bowe Points 3390

Voici un cours que j'ai utilisé par le passé. Il évalue les chaînes exactement comme le fait eval () en Javascript.

 String result = ExpressionEvaluator.EvaluateToString("(2+5) < 8");
 

Tout ce que vous avez à faire est de construire une chaîne à évaluer à partir de vos objets métier, ce qui résoudra toute la logique imbriquée, etc.

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

8voto

Hector Sosa Jr Points 3422

Aucun de l'open source .NET règles-moteur support de stockage de règles dans la base de données. Les seuls qui sont stockées les règles dans une base de données commerciale. J'ai créé quelques Isu pour règle personnalisée moteurs de la base de données, mais cela peut être non négligeable à mettre en œuvre. C'est généralement la principale raison, vous ne verrez pas cette fonctionnalité gratuitement.

Autant que je sache, aucun d'entre eux répondent à tous vos critères, cependant, voici une liste de ceux que je connais:

La plus simple est SRE
http://sourceforge.net/projects/sdsre/

Une règle de gestion de l'INTERFACE utilisateur est NxBRE
http://www.agilepartner.net/oss/nxbre/

Drools.NET utilise JBOSS rules
http://droolsdotnet.codehaus.org/

Personnellement, je n'ai pas utilisé l'un d'eux, parce que tous les projets que j'ai travaillé avec jamais voulu utiliser quelque chose de construit dans-maison. La plupart des entreprises pensent que c'est assez facile à faire, mais à la fin de perdre trop de temps à coder et à mettre en œuvre. C'est l'une de ces zones que les Pas Inventé Ici " Syndrome (NIH) des règles.

7voto

James Curran Points 55356

Etant donné que l’expression logique n’est qu’un sous-ensemble de l’expression mathématique, vous pouvez essayer d’essayer NCalc - Mathematical Expressions Evaluator pour .NET sur CodePlex.

5voto

Will Points 76760

La solution MS officielle pour cela est Windows Workflow . Bien que je n'appelle pas cela "simple", cela répond à toutes vos spécifications (ce qui nécessiterait de toute façon un cadre étendu).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X