在.NET中寻找简单的规则引擎库


68

谁知道一个好的.NET库规则库(理想情况下是开源的)?我需要一些可以执行嵌套逻辑表达式的东西,例如(A AND B)AND(B OR C OR D)。我需要比较对象属性,例如A.P1和B.P1。(理想情况下,我可以比较任何属性-A.P1和B.P2)。

它应该将规则存储在数据库中(我有很多简单的可配置逻辑)。并且它应该具有规则创建/管理API。管理工具将必须检查实例以确定哪些属性可用以及存在哪些约束。

谢谢!


哦,还有一件事。作为规则引擎,我需要包括“动作(命令)”的概念。这些是表达式返回时执行的内容:

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

因此,我将规则视为:

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

Answers:


46

同意我会说使用工作流引擎家族中的某些东西,尽管不是工作流。检查一下System.Workflow.Activities.Rules命名空间-它在.Net 3中受支持,并内置在.Net3.5中。您可以像上面提到的那样免费使用所有东西:

  • RuleCondition用于条件,RuleAction用于操作

  • 用于描述元代码的标准化格式(CodeDom-CodeExpressions)

  • 您可以通过TypeProviders将任何类型的复杂性插入其中(以说出真相,除了Linq和lambdas以及某种扩展方法)

  • 有一个内置的编辑器,用于使用智能感知进行规则编辑

  • 由于该规则是可序列化的,因此可以轻松持久

  • 如果您打算在数据库方案上使用规则,则可以通过typeprovider来实现

首先: 在工作流之外使用规则

附注:我们正在广泛使用它,并且该命名空间中的内容比您想象的要多->完整的元算法语言

最重要的是:它易于使用-确实


1
很棒的帖子,这就是我们过去使用的内容,并且发现在所有Windows工作流框架中充分利用规则引擎部分非常强大。
布莱恩·斯科特

18

这是我过去使用的课程。就像eval()在Javascript中一样,它计算字符串。

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

您需要做的就是构造一个要从您的业务对象进行评估的字符串,这将处理所有复杂的嵌套逻辑等。

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

2
我在网络应用程序上尝试了您的代码。不幸的是,由于对asp temp文件夹具有权限,因此动态编译不适用于Web应用程序。

8

开源.NET规则引擎均不支持将规则存储在数据库中。唯一将规则存储在数据库中的规则是商业性的。我为运行在数据库上的自定义规则引擎创建了一些UI,但这对实现而言可能并非易事。这通常是您不会免费看到该功能的主要原因。

据我所知,它们都不符合您的所有条件,但以下是我所知道的那些:

最简单的一种是SRE
http://sourceforge.net/projects/sdsre/

带有规则管理用户界面的是NxBRE
http://www.agilepartner.net/oss/nxbre/

Drools.NET使用JBOSS规则
http://droolsdotnet.codehaus.org/

我个人没有使用过它们,因为与我一起工作的所有项目都不想使用内部构建的东西。大多数企业认为这很容易做到,但是最终浪费了太多的时间编码和实现它。这是“此处未发明综合症”(NIH)规定的领域之一。


2
Drools.NET并不是一个好主意,它依赖于仍处于beta版的.Net中的JVM实现,并对其进行了尝试,而IMHO确实还没有投入生产。
pmlarocque

1
这里有人使用过SRE吗?有什么经验?
库尔兹(Kurtz)

7

好吧,由于逻辑表达式只是数学表达式的一部分,因此您可能需要在CodePlex上尝试使用NCalc-.NET的数学表达式评估器


嘿,那实际上很整洁。尽管从示例中可以看出,我认为可能存在一种更为优雅的评估委托表达式的方法。这可能是在表达式操作数上插入一些反射的扩展点。
库尔兹(Kurtz)

5

官方的MS解决方案是Windows Workflow。尽管我不会称其为“简单”,但它符合您的所有规范(无论如何,都需要一个广泛的框架来满足)。


当前的WF规则引擎有一个缺点...它使用一小部分代码域表达式,但实际上会进行字符串解析以生成基础代码,而不是CodeDom类。
Scott Dorman

最初我使用的是Drools 3.0,但是它不支持.Net Framework 4.5。所以我可以用它代替Drools吗?
Shyam Dixit 2014年

@ShyamDixit:对不起,不知道,但是我会根据WF3在当前的开发中选择任何东西。这个答案已经快六年了。不要通过阅读古老的文章/问题/答案来做出决定。

是否可以使用WF来解析数据?@Will
Shyam Dixit

@ShyamDixit:我不推荐。


3

Windows Workflow Foundation确实为您提供了免费的前向链接推理引擎。而且,您可以在没有工作流程部分的情况下使用它。开发人员可以创建和编辑规则。

如果您想让非程序员编辑和维护规则,可以尝试使用规则管理器

规则管理器将为您生成一个有效的Visual Studio解决方案。那应该可以让您快速入门。只需单击File \ Export并选择WFRules格式。


这是WWF规则引擎的改进的Serilizer:github.com/chriseyre2000/perfectstorm/tree/master
Chriseyre2000 2013年

答案中提供的链接已断开,请更新
jayasurya_j



1

也许看看SmartRules。它不是免费的,但是界面看起来很简单。

只知道它,因为我以前从那里使用过SmartCode codegen实用程序。

以下是网站中的示例规则:

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

现在退出。尝试其他地方。
Firestrand 2011年




0

根据您要使用Lambda表达式(和表达式树)尝试执行的操作,可以使用此概念。本质上,您提供一个作为字符串的表达式,然后将该表达式立即编译为lambda表达式/表达式树,然后可以执行(评估)。一开始了解起来并不容易,但是一旦完成,它的功能将非常强大,并且设置起来也非常简单。


是的,我了解Lambda表达式的用法,如果我从头开始构建它,会使用它们。但是,我希望这个库的胆量已经存在或可以拼凑在一起。
库尔兹(Kurtz)

我不知道...有几种可用的规则引擎类型库,但是它们都不是特别简单和/或高效的,并且都不使用lambda表达式。
Scott Dorman

0

它不是免费的,因为您无法轻松地将其从BizTalk父系中解脱出来,但是BizTalk的业务规则引擎组件是与核心BizTalk引擎本身独立的实体,并且包含功能非常强大的规则引擎,其中包括基于规则/策略的GUI。如果有免费版本,它将满足您的要求(仅为BRE购买BizTalk不会真正在商业上起作用。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.