.NET的规则引擎

我们有业务要求让高级用户编辑保险费率和注册的规则。 我们需要一个web ui,让他们说“这个产品仅适用于人们<55,除非他们来自德克萨斯州并拥有一只贵宾犬”或其他什么。 编辑澄清:保险是疯了。 规则因产品,产品状态和状态而异,并且不断变化。

我们查看了几个规则引擎,但商业规则引擎是100K +,开源代码似乎不是,完成了。 如果我们提前创建规则,Windows Workflow会起作用,但在运行时构建它们似乎需要绕过代码访问安全性。 那太可怕了。

我们难以重新发明这个轮子吗? 对.net有更好的选择吗?

我不认为对规则的评估将是挑战。 我认为更大的挑战是解析用户可以输入的规则。 要解析规则,您应该考虑创建一些DSL。 Martin Fowler对此有一些想法。 那么也许ANTLR可能值得一看。

对于评估部分:我在金融行业工作,也有复杂的规则,但我从来没有使用过规则引擎。 命令式编程语言(在我的情况下是C#)的手段(直到现在)已经足够了。 在某些情况下,我正在考虑使用规则引擎,但规则引擎的技术风险(*)总是高于预期的收益。 这些规则(直到现在)从未如此复杂,需要声明性编程模型。

如果您使用的是面向对象语言,则可以尝试应用规范模式 。 Eric Evans和Martin Fowler写了一个更详细的解释,你可以在这里找到。 或者,您可以编写自己的简单规则引擎。

(*)脚注:不知何故,您需要将规则引擎嵌入到您的应用程序中,这很可能是用面向对象的语言编写的。 所以有一些技术边界,你必须弥合。 每一座这样的桥梁都是技术风险。 我曾经见过一个使用C语言编写的规则引擎的Java Web应用程序。最初,C程序有时会产生核心转储并破坏整个Web应用程序。

我认为,与大多数制作和购买决策一样,它总是需要你个人做出的权衡。 如果你购买一个售价100K +的现成解决方案而且你只会使用1%,那可能是一些不明智的花费。 但是,如果产品非常合适,那么几乎可以肯定你永远不能以更少的价格构建产品(假设他们在该特定领域拥有丰富的经验)。

所以,只要你没有尝试完成搁置产品所做的一切,只关注你需要的特定function而不是让自己受到构建一个非常好的想法的诱惑,你就不会疯狂地重新发明这个轮子。 (但价格昂贵)框架非常简单。

100K不是笨蛋变化,但是一年级的程序员几乎肯定会花费更多 – 你有一个更便宜的程序员能比一年更快吗? 是否会(或满足您的需求)或更好?

这不是我的领域,我偶然来到这个问题,所以我可能会离开,但我会看看Wolfram Mathematica 。 它是一种技术计算环境和多范式(专有)编程语言,支持许多编程风格(包括基于规则和函数编程)。 它的核心是一个非常通用的规则引擎。 尽管数学软件的名称和声誉(它是),但它是一种通用的编程语言,非常高级。 它的一个子集可以编译为C.它可以动态加载外部dll,并且它与Java和.Net平台透明地互操作。 它有一个web版本 – webMathematica(它基于Java,但jsp + Tomcat,但没有人阻止你直接与基于.Net的web层连接,只需要做一些工作)。 另外一个好处是,如果您需要任何数学计算,分析,绘图,统计数据,那么它就是最先进的和最先进的。

我认为在Mathematica中开发所需的function要比在许多其他语言/解决方案中快得多(我在Mathematica,C,Java和Javascript中专业编程,所以至少可以比较这些语言)。 我认为,对于一台机器(4芯),完整的商业许可证应为2或3 K. 它有几个并行化function。 这种方法最难的事情就是找到一位称职的Mathematica程序员,但具有function/基于规则的编程背景的人(比如说LISP / Prolog)应该能够很快地掌握这些东西。 此外,如果您需要非常高的性能,它可能不够快 – 我真的不知道它在性能方面与其他规则引擎的比较。 有时,我有机会在Mathematica中将基于规则的解决方案与编译为C的问题进行比较,并且我会说基于规则的编写良好的代码应该在性能方面处于Python级别,并且平均可能比编译为C的那个慢一个数量级左右。但这主要是针对数值/计算或数据操作相关的问题,所以我认为问题本质上是基于规则,性能差距可能小一点。

我确信的一件事是,在Mathematica中,您可以使用少量代码轻松地创建任何通用性和复杂性的规则集。 它是基于我到目前为止遇到的规则进行探索性编程的最佳工具,开发周期非常短。 我邀请您访问SO的Mathematica标签 ,看看人们用它解决了哪些类型的问题。 对于一个完全用Mathematica语言编写的着名项目(1500万行代码),请查看WolframAlpha知识引擎。

对.net有更好的选择吗?

一种选择是在.net代码中使用嵌入式脚本引擎,如Iron Python。 为用户提供GUI制定规则,将“规则”转换为Python脚本,调用.Net内部的Python脚本引擎来执行脚本。

我们难以重新发明这个轮子吗?

如果没有现成的产品满足您的需求,那么

问题在于,这些事情与企业如何独特运作密切相关,即使不是不可能,也很难有效地使用现成的解决方案。

我做了两件不同的事情。

最新的(在VS 2005 / Framework 2.0中)是创建一个基本引擎来处理全面的常见最低要求。 这将是名称,地址等等。然后我写了一系列扩展DLL,使用通用接口将通过reflection加载特定类型/区域,例如,通过状态或产品线。 高级用户可以使用简单的应用程序来创建他们需要的帐户配置(配置存储在数据库中)。 如果事情发生了变化,可以修改底层DLL或添加新的DLL。 在我参与这个项目的4年中,我只需要添加一个新的扩展DLL,但通常每个规则需要一个或两个小mod。

在早期的VB6项目中,我使用了引导式VBScript为高级用户提供了编写某些规则的能力。 虽然用户很了解Excel脚本并且编写了向导界面来帮助他们完成他们需要做的事情,但他们通常只是给了我编写规则的工作。 这个计划有点适用,所以我之后不再使用它,而是选择了更多“检查,选择那种”规则建设的方法。

如果规则很简单,编写自己的引擎就可以了。 它们越复杂,维护它所需的时间就越多。

您可以使用Drools Server来执行规则,并使用.NET或您喜欢的任何语言继续执行主应用程序。 您仍然需要Java用于Drools Server部分。