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

时间:2008-10-16 13:53:52

标签: c# .net .net-core logic rule-engine

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

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

谢谢!


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

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

所以我认为规则如下:

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

15 个答案:

答案 0 :(得分:46)

同意我会说使用工作流引擎系列中的某些东西,尽管不是工作流程。 稍微检查System.Workflow.Activities.Rules命名空间 - 它在.Net 3中得到支持,并内置到.Net3.5中。你手边的所有东西都可以像你提到的那样免费使用:

  • 条件的RuleCondition,行动的RuleAction

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

  • 你可以插入任何复杂性 进入那个(说实话除外 Linq和lambdas等延伸 某种方法)通过 TypeProviders

  • 有一个用于规则的内置编辑器 使用intellisense进行编辑

  • 因为规则是可序列化的,所以可以 容易坚持

  • 如果您打算将规则用于a 数据库方案然后通过typeprovider 它也可以实施

首发:  Using rules outside of a workflow

Ps。:我们广泛使用它,并且该命名空间中的内容远远超出您的想象 - >完整的元算法语言

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

答案 1 :(得分: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 :(得分:8)

开源的.NET规则引擎都不支持在数据库中存储规则。唯一存储规则的数据库是商业的。我已经为运行数据库的自定义规则引擎创建了一些UI,但实现起来并非易事。这通常是你不会免费看到这个功能的主要原因。

据我所知,他们都没有达到你所有的标准,但这里列出了我所知道的:

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

具有规则管理UI的一个是NxBRE
http://www.agilepartner.net/oss/nxbre/

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

我个人没有使用过它们,因为我合作的所有项目都不想使用内部构建的东西。大多数企业认为这很容易做到,但最终会浪费太多时间编写和实现它。这是Not Invented Here Syndrome(NIH)规则的那些领域之一。

答案 3 :(得分:7)

好吧,因为逻辑表达式只是数学表达式的一个子集,所以您可能想在CodePlex上尝试NCalc - Mathematical Expressions Evaluator for .NET

答案 4 :(得分:5)

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

答案 5 :(得分:4)

我过去曾成功使用此http://www.codeproject.com/KB/recipes/Flee.aspx。试一试。

答案 6 :(得分:3)

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

如果您希望非程序员编辑和维护规则,您可以试用Rule Manager

规则管理器将为您生成可视的工作室解决方案。这应该让你很快开始。只需单击File \ Export并选择WFRules格式。

答案 7 :(得分:2)

您也可以在http://www.FlexRule.com

查看我们的产品

FlexRule是一个业务规则引擎框架,支持三个引擎;程序引擎,推理引擎和RuleFlow引擎。它的推理引擎是一种使用Rete算法的增强实现的正向链接推理。

答案 8 :(得分:1)

我会看一下Windows Workflow。规则引擎和工作流程往往从简单开始,逐渐变得更加复杂。像Windows Workflow Foundation这样的东西并不难开始,并为增长提供了空间。 Here is a post that shows it's not too difficult to get a simple workflow engine going.

答案 9 :(得分: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

答案 10 :(得分:1)

您可以使用RuEn,一个由我创建的基于规则引擎的简单开源属性:

http://ruen.codeplex.com

答案 11 :(得分:1)

在CodeProject上查看Logician:tutorial/overview

项目:SourceForge上的page/source

答案 12 :(得分:1)

试试 http://rulesengine.codeplex.com/

这是一个与Expression树一起使用的C#开源规则引擎。

答案 13 :(得分:0)

根据您尝试使用Lambda表达式(和表达式树)尝试执行的操作,可以使用此概念。本质上,您将表达式作为字符串提供,然后将其动态编译为lambda表达式/表达式树,然后您可以执行(evaluate)。一开始理解起来并不简单,但一旦你做到这一点,它就会非常强大并且设置起来相当简单。

答案 14 :(得分:0)

它不是免费的,因为你不能轻易地从它的BizTalk父系中解开它,但BizTalk的业务规则引擎组件是核心BizTalk引擎本身的独立实体,并且包含一个包含规则的非常强大的规则引擎/基于策略的GUI。如果有免费版本,它将符合您的要求(仅为BRE购买BizTalk不会真正商业化。)