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

本文关键字:规则 引擎 简单 NET 寻找 | 更新日期: 2023-09-27 17:47:47

有人知道一个好的.NET库规则库(最好是开源的)吗?我需要一些可以做嵌套逻辑表达式的东西,例如(A AND B)AND(B OR C OR 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(); 
            }
        } 
    }
}

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

我同意使用工作流引擎家族中的一些东西,尽管不是工作流。稍微检查一下System.Workflow.Activities.Rules命名空间-它在.Net 3中受支持,并内置在.Net 3.5中。你手头有一切可以免费使用,就像你提到的:

  • RuleCondition表示条件,RuleAction表示动作

  • 描述的标准格式元代码

  • 你可以插入任何复杂的插件说实话Linq和lambdas等扩展某种方法)通过类型提供商

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

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

  • 如果你想在然后通过类型提供者的数据库方案它也可以实现

对于启动器:使用工作流之外的规则

Ps.:我们正在广泛使用它,这个名称空间中的内容比你想象的要多得多->一个完整的元算法语言

最重要的是:它很容易使用-实际上

这是我过去使用过的一个类。它对字符串的求值方式与java脚本中的eval()类似。

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

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

据我所知,没有一个能满足你的所有标准,但下面是我所知道的

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

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

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

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

由于逻辑表达式只是数学表达式的一个子集,您可能需要在CodePlex上尝试NCalc-.NET数学表达式计算器。

这方面的官方MS解决方案是Windows工作流。虽然我不会称之为"简单",但它符合您的所有规范(无论如何,这需要一个广泛的框架才能满足)。

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

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

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

规则管理器将为您生成一个有效的visual studio解决方案。这应该会让你很快开始。只需单击"文件''导出",然后选择WFRules格式。

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

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

我会看看Windows工作流。规则引擎和工作流往往从简单开始,逐渐变得更加复杂。像Windows Workflow Foundation这样的东西一开始并不太难,而且提供了增长空间。这里有一篇文章表明,启动一个简单的工作流引擎并不太难。

也许可以查看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

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

http://ruen.codeplex.com

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

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

看看Logician:CodeProject 教程/概述

项目:SourceForge 上的page/source

根据您试图使用Lambda表达式(和表达式树)来实现这一概念。从本质上讲,您可以将表达式作为字符串提供,然后将其动态编译到lambda表达式/表达式树中,然后执行(求值)。一开始理解起来并不简单,但一旦理解了,它就会非常强大,而且设置起来也相当简单。

它不是免费的,因为您无法轻松地将其从BizTalk父级中分离出来,但BizTalk的业务规则引擎组件是一个独立于核心BizTalk引擎本身的实体,包含一个非常强大的规则引擎,其中包括一个基于规则/策略的GUI。如果有免费版本,它将符合您的要求(仅为BRE购买BizTalk在商业上是行不通的。)