Vous cherchez une bibliothèque de moteur de règles simple dans .NET

Est-ce que quelqu’un connaît une bonne bibliothèque de règles de bibliothèque .NET (idéalement open-source)? J’ai besoin de quelque chose qui puisse faire des expressions logiques nestedes, par exemple (A et B) et (B ou C ou D). Je dois faire des comparaisons de propriétés d’object, par exemple, A.P1 et B.P1. (Idéalement, je pourrais comparer n’importe quelle propriété – A.P1 et B.P2).

Il devrait stocker les règles dans une firebase database (j’ai beaucoup de logique configurable simple). Et il devrait avoir une API de création / gestion de règles. L’outil de gestion devrait inspecter les instances pour déterminer quelles propriétés sont disponibles et quelles contraintes existent.

Merci!


Oh, encore une chose. En tant que moteur de règles, je dois inclure le concept d’actions (commandes). Ce sont quoi exécuter lorsque l’expression retourne:

If (expression.Evaluation) { actions.Execute(); } 

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

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

    En accord avec will je dirais utiliser quelque chose de la famille du moteur de workflow mais pas de workflow. Examinez un peu l’espace de noms System.Workflow.Activities.Rules – il est pris en charge dans .Net 3 et intégré à .Net3.5. Vous avez tout en main gratuitement à utiliser comme vous l’avez mentionné:

    • RuleCondition pour les conditions, RuleAction pour les actions

    • format standardisé pour décrire le métacode (CodeDom – CodeExpressions)

    • vous pouvez twigr n’importe quel type de complexité à cela (pour dire la vérité, à l’exception de Linq et de lambdas et donc des méthodes d’extension de quelque sorte) via TypeProviders

    • il y a un éditeur intégré pour l’édition de règles avec intellisense

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

    • si vous vouliez utiliser les règles sur un schéma de firebase database, vous pouvez également implémenter via typeprovider

    Pour un débutant: Utiliser des règles en dehors d’un workflow

    Ps .: nous l’utilisons beaucoup et il y a beaucoup plus dans cet espace de nommage que vous ne l’imaginez jamais -> un langage complet d’algorithme de méta

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

    Voici une classe que j’ai utilisée par le passé. Il évalue les chaînes comme eval () en Javascript.

     Ssortingng result = ExpressionEvaluator.EvaluateToSsortingng("(2+5) < 8"); 

    Tout ce que vous avez à faire est de construire une chaîne de caractères à évaluer à partir de vos objects métier et cela prendra en compte toute la logique nestede compliquée, etc.

     using System; using System.CodeDom.Comstackr; 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 ssortingng _evaluatorSourceCode = @"package Evaluator { class Evaluator { public function Eval(expr : Ssortingng) : Ssortingng { return eval(expr); } } }"; #endregion #region static methods private static object GetEvaluator() { ComstackrParameters parameters; parameters = new ComstackrParameters(); parameters.GenerateInMemory = true; JScriptCodeProvider jp = new JScriptCodeProvider(); ComstackrResults results = jp.ComstackAssemblyFromSource(parameters, _evaluatorSourceCode); Assembly assembly = results.ComstackdAssembly; _evaluatorType = assembly.GetType("Evaluator.Evaluator"); return Activator.CreateInstance(_evaluatorType); } ///  /// Executes the passed JScript Statement and returns the ssortingng representation of the result ///  /// A JScript statement to execute /// The ssortingng representation of the result of evaluating the passed statement public static ssortingng EvaluateToSsortingng(ssortingng statement) { object o = EvaluateToObject(statement); return o.ToSsortingng(); } ///  /// Executes the passed JScript Statement and returns the result ///  /// A JScript statement to execute /// The result of evaluating the passed statement public static object EvaluateToObject(ssortingng statement) { lock (_evaluator) { return _evaluatorType.InvokeMember( "Eval", BindingFlags.InvokeMethod, null, _evaluator, new object[] { statement }, CultureInfo.CurrentCulture ); } } #endregion } } 

    Aucun moteur de règles .NET à source ouverte ne prend en charge le stockage de règles dans la firebase database. Les seules qui stockent les règles dans une firebase database sont commerciales. J’ai créé des interfaces utilisateur pour les moteurs de règles personnalisés qui s’exécutent sur la firebase database, mais cela peut être non sortingvial à mettre en œuvre. C’est généralement la raison principale pour laquelle vous ne verrez pas cette fonctionnalité gratuitement.

    Pour autant que je sache, aucun d’entre eux ne répondra à tous vos critères, mais voici une liste de ceux que je connais:

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

    L’un avec l’interface de gestion des règles est NxBRE
    http://www.agilepartner.net/oss/nxbre/

    Drools.NET utilise les règles JBOSS
    http://droolsdotnet.codehaus.org/

    Personnellement, je n’en ai utilisé aucun, car tous les projets avec lesquels je travaillais n’ont jamais voulu utiliser quelque chose de construit en interne. La plupart des entresockets pensent que c’est assez facile à faire, mais finissent par perdre trop de temps à le coder et à le mettre en œuvre. C’est l’une de ces zones que les règles NIH (Non Invented Here Syndrome).

    Eh bien, puisque l’expression logique n’est qu’un sous-ensemble de l’expression mathématique, vous pouvez essayer NCalc – Mathematical Expressions Evaluator pour .NET sur CodePlex.

    La solution MS officielle pour cela est Windows Workflow . Bien que je ne l’appelle pas “simple”, il répond à toutes vos spécifications (ce qui nécessiterait un cadre complet pour répondre, de toute façon).

    J’ai utilisé cette http://www.codeproject.com/KB/recipes/Flee.aspx avec succès par le passé. Essaie.

    Windows Workflow Foundation vous offre un moteur d’inférence de chaînage vers l’avant gratuit. Et vous pouvez l’utiliser sans la partie workflow. Les règles de création et d’édition sont acceptables pour les développeurs.

    Si vous souhaitez que les non-programmeurs modifient et gèrent les règles, vous pouvez essayer le gestionnaire de règles .

    Le gestionnaire de règles va générer une solution de studio visuel fonctionnelle pour vous. Cela devrait vous permettre de démarrer assez rapidement. Cliquez simplement sur Fichier \ Exporter et sélectionnez le format WFRules.

    Vous pouvez également consulter notre produit sur http://www.FlexRule.com

    FlexRule est un framework Business Rule Engine prenant en charge trois moteurs; Moteur de procédure, moteur d’inférence et moteur RuleFlow. Son moteur d’inférence est une inférence de chaînage avant qui utilise une implémentation améliorée de l’algorithme Rete.

    Je regarderais Windows Workflow. Les moteurs de règles et le workflow ont tendance à être simples et à devenir de plus en plus complexes. Quelque chose comme Windows Workflow Foundation n’est pas trop difficile à démarrer et offre une marge de croissance. Voici un post qui montre qu’il n’est pas trop difficile de faire fonctionner un simple moteur de workflow.

    Peut-être vérifier SmartRules . Ce n’est pas gratuit, mais l’interface semble simple.

    Ne le sais que parce que j’ai déjà utilisé l’utilitaire SmartCode codegen.

    Voici un exemple de règle du site Web:

     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 

    Vous pouvez utiliser un RuEn, un simple moteur de règles basé sur un atsortingbut open source créé par moi:

    http://ruen.codeplex.com

    Essayez http://rulesengine.codeplex.com/

    C’est un moteur de règles C # Open-Source qui fonctionne avec les arbres d’expression.

    Regardez Logician: tutoriel / aperçu sur CodeProject

    Projet: page / source sur SourceForge

    Selon ce que vous essayez de faire, utiliser des expressions Lambda (et des arbres d’expression) peut fonctionner pour ce concept. Essentiellement, vous fournissez une expression sous forme de chaîne qui est ensuite compilée à la volée dans une expression / un arbre d’expression lambda, que vous pouvez ensuite exécuter (évaluer). Ce n’est pas simple à comprendre au début, mais une fois que c’est fait, il est extrêmement puissant et assez simple à configurer.

    Ce n’est pas gratuit, car vous ne pouvez pas facilement le démêler de sa parenté BizTalk, mais les composants de règles métier de BizTalk sont une entité distincte du moteur BizTalk central et comprennent un moteur de règles très puissant qui inclut une règle / politique GUI. S’il y avait une version gratuite de cela, cela correspondrait à vos besoins (acheter BizTalk uniquement pour le BRE ne fonctionnerait pas vraiment commercialement.)