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

有谁知道一个好的.NET库规则库(理想的开源)? 我需要一些可以嵌套逻辑expression式的东西,例如(A和B)和(B或C或D)。 我需要做对象属性的比较,例如A.P1和B.P1。 (理想情况下,我可以比较任何财产 – A.P1和B.P2)。

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

谢谢!


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

如果(expression.Evaluation){actions.Execute(); }

所以我看到一个规则是这样的:

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

同意我会说使用工作stream引擎家族的东西,虽然不是工作stream。 检查System.Workflow.Activities.Rules命名空间有点 – 它在.Net 3中被支持,并被内置到.Net3.5中。 你可以像所提到的那样免费使用一切:

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

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

  • 你可以通过TypeProviders插入任何复杂的东西(除了Linq和lambdas以及某种扩展方法外)

  • 有一个用intellisense编辑规则的内置编辑器

  • 作为规则可序列化,它可以很容易地坚持下去

  • 如果你打算使用数据库scheme的规则,然后通过typeprovider它也可以实现

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

Ps:我们正在广泛使用它,并且在这个名字空间中比你想像的要多得多 – >一个完整的元algorithm语言

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

这是我以前用过的课。 它像Javascript中的eval()那样评估string。

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

所有你需要做的是构造一个string来评估你的业务对象,这将照顾所有复杂的嵌套逻辑等

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

那么,因为逻辑expression式只是mathexpression式的一个子集,所以您可能想在CodePlex上尝试使用NCalc – .NET的mathexpression式计算器 。

没有一个开放源代码的.NET规则引擎支持在数据库中存储规则。 将规则存储在数据库中的唯一方法是商业性的。 我为自定义规则引擎创build了一些UI,这些自定义规则引擎是从数据库运行的,但是这可能是不平凡的。 这通常是你不会免费看到这个function的主要原因。

据我所知,他们都不会满足你所有的标准,但是这里列出了我所知道的:

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

规则pipe理用户界面是NxBRE
http://www.agilepartner.net/oss/nxbre/

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

我个人并没有使用过,因为我所使用的所有项目都不想使用内置的东西。 大多数企业认为这很容易做,但最终浪费太多的时间来编码和实施它。 这是这里不发明综合症状(NIH)规则的那些区域之一。

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

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

Windows Workflow Foundation确实为您提供免费的前向链接推理引擎。 而且您可以在没有工作stream程的情况下使用它。 创build和编辑规则对于开发者来说是可以的。

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

规则pipe理器将为您生成一个可用的Visual Studio解决scheme。 这应该让你开始相当快。 只需点击File \ Export并selectWFRules格式。

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

FlexRule是一个业务规则引擎框架,支持三个引擎。 程序引擎,推理引擎和RuleFlow引擎。 它的推理机是一个使用Retealgorithm的增强实现的前向链推理。

我会看看Windows工作stream程。 规则引擎和工作stream程往往开始简单,逐步变得更加复杂。 像Windows Workflow Foundation这样的东西不难开始,并提供了增长的空间。 这里是一个post,显示了简单的工作stream引擎不会太困难。

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

http://ruen.codeplex.com

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

这是一个C#开放源代码规则引擎,与expression式树一起工作。

看看CodeProject上的Logician: tutorial / overview

项目:SourceForge上的页面/源代码

根据您使用Lambdaexpression式(和expression式树)所做的尝​​试可以为这个概念工作。 从本质上讲,你提供一个expression式作为一个string,然后编译到一个lambdaexpression式/expression式树,然后你可以执行(评估)。 起初并不是很容易理解,但是一旦你做到了,这个function就非常强大,而且相当简单。

也许检查一下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 

这不是免费的,因为你不能轻易地将它从BizTalk的血统中解脱出来,但是BizTalk的业务规则引擎组件是一个与核心BizTalk引擎本身不同的实体,并且包含一个非常强大的规则引擎,它包括基于规则/策略GUI。 如果有一个免费的版本,这将符合您的要求(购买BizTalk只是为了BRE不会真的在商业上)。