在.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://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不会真的在商业上)。