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

15 回答 15

46

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

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

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

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

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

  • 由于规则是可序列化的,因此可以很容易地持久化

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

对于初学者: 在工作流程之外使用规则

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

最重要的是:它很容易使用——真的

于 2009-03-24T16:29:33.873 回答
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
  }    
}
于 2008-10-16T14:24:44.537 回答
8

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

据我所知,它们都不符合您的所有标准,但以下是我所知道的列表:

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

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

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

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

于 2008-10-16T14:15:49.407 回答
7

好吧,由于逻辑表达式只是数学表达式的一个子集,您可能想在 CodePlex 上尝试NCalc - 用于 .NET 的数学表达式评估器。

于 2008-10-16T14:14:52.840 回答
5

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

于 2008-10-16T14:08:37.037 回答
4

我过去成功地使用了这个http://www.codeproject.com/KB/recipes/Flee.aspx。试试看。

于 2011-10-27T02:18:07.937 回答
3

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

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

Rule Manager 将为您生成一个有效的 Visual Studio 解决方案。这应该让你很快开始。只需单击文件\导出并选择 WFRules 格式。

于 2010-01-04T18:27:51.817 回答
2

您也可以在http://www.FlexRule.com上查看我们的产品

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

于 2011-10-07T05:09:35.830 回答
1

看看 Logician:CodeProject 上的教程/概述

项目:SourceForge 上的页面/来源

于 2011-05-17T14:41:15.470 回答
1

Maybe check out SmartRules. Its not free, but the interface looks simple enough.

Only know about it because I've used the SmartCode codegen utility from there before.

Here is an example rule from the 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
于 2009-06-01T01:43:04.123 回答
1

我会看看 Windows 工作流。规则引擎和工作流程往往一开始很简单,然后逐渐变得复杂。像 Windows Workflow Foundation 这样的东西起步并不难,并且提供了增长空间。 这是一篇文章,表明让一个简单的工作流引擎运行起来并不难。

于 2009-03-24T16:41:26.823 回答
1

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

http://ruen.codeplex.com

于 2010-01-28T08:37:22.737 回答
1

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

它是一个与表达式树一起使用的 C# 开源规则引擎。

于 2011-09-07T06:01:14.100 回答
0

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

于 2008-10-16T14:52:42.813 回答
0

它不是免费的,因为您无法轻松地将其与 BizTalk 父级解开,但 BizTalk 的业务规则引擎组件是与核心 BizTalk 引擎本身分开的实体,并包含一个非常强大的规则引擎,其中包括基于规则/策略的图形用户界面。如果有一个免费版本,它将满足您的要求(仅为 BRE 购买 BizTalk 不会真正在商业上起作用。)

于 2009-12-21T15:57:16.177 回答