. net的规则引擎

本文关键字:引擎 规则 net | 更新日期: 2023-09-27 18:09:23

我们有一个业务需求,允许高级用户编辑保险费率和登记规则。我们需要一个网页界面,让他们说"这个产品只适用于55岁的人,除非他们来自德克萨斯州并拥有一只贵宾犬"或其他什么。编辑澄清:保险是疯狂的。规则因产品而异,因状态而异,且不断变化。

我们看了几个规则引擎,但是商业的是100K+,开源的似乎还没有完成。如果我们提前创建规则,Windows Workflow就可以工作,但是在运行时构建它们似乎需要绕过代码访问安全。这是可怕的。

我们要重新发明轮子吗?

. net的规则引擎

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

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

如果您正在使用面向对象的语言,您可以尝试应用规范模式。埃里克·埃文斯和马丁·福勒写了一篇更详细的解释,你可以在这里找到。或者,您可以编写自己的简单规则引擎。

(*)脚注:你需要将规则引擎嵌入到你的应用程序中,而你的应用程序很可能是用一些面向对象的语言编写的。所以有一些技术上的界限,你必须跨越。每一座这样的桥梁都存在技术风险。我曾经目睹过一个使用C语言编写的规则引擎的Java web应用程序。在开始的时候,C程序有时会产生核心转储并导致整个web应用程序崩溃。

我认为,就像大多数自制与购买的决定一样,这总是一个你必须亲自做出的权衡。如果你买了一个现成的解决方案,花费超过10万美元,你只会使用其中的1%,这可能是一些不明智的花费。然而,如果产品是一个完美的契合,那么你几乎可以肯定,你永远不会以更低的价格制作它(假设他们在该特定领域有很多经验)。

所以,只要你不尝试做所有现成产品所做的事情,只关注你需要的特定功能,而不是被为非常简单的东西构建一个非常好的(但昂贵的)框架的想法所诱惑,你就不是在重新发明轮子。

100K不是一笔小数目,但是一个像样的程序员一年的花费肯定会比这个多——你有更便宜的程序员可以比一年更快地完成吗?它会和(你的需求)一样好还是更好?

这不是我的研究领域,我偶然发现了这个问题,所以我可能会离开,但我想看看Wolfram Mathematica。它是一种技术计算环境和多范式(专有)编程语言,支持多种编程风格(包括基于规则的和函数式编程)。它的核心是一个非常通用的规则引擎。尽管它的名字和声誉是数学软件(它确实是),但它是一种通用的编程语言,非常高级。它的一个子集可以被编译成c语言。它可以动态加载外部dll,并且透明地与Java和。net平台互操作。它有一个web版本——webMathematica(它是基于Java, jsp+Tomcat,但是没有人阻止你直接将它与基于。net的web层连接起来,只是需要做更多的工作)。额外的好处是,如果你需要任何数学计算、分析、绘图、统计,它都在那里,最先进的。

我认为在Mathematica中开发所需的功能应该比在许多其他语言/解决方案中要快得多(我在Mathematica, C, Java和Javascript中进行专业编程,因此至少可以比较这些语言)。我认为,对于一台机器(4核),完整的商业许可应该是2或3 K。它有几个并行化特性。在这种方法中,最难的事情是找到一个称职的Mathematica程序员,但是具有函数式/基于规则的编程(比如LISP/Prolog)背景的人应该能够相当快地掌握这些知识。此外,如果您需要非常高的性能,它可能不够快——我真的不知道它在性能方面与其他规则引擎相比如何。有时,我有机会比较Mathematica基于规则的解决一些问题的一个编译C和我说写规则的代码应该是Python的性能水平,平均也许慢一个数量级左右比编译C,但主要是数值/计算或data-manipulation-related问题,所以我认为问题本质上基于规则,可能小的性能差距。

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

是否有更好的。net替代方案?

一个选择是在。net代码中使用嵌入式脚本引擎,比如Iron Python。给你的用户一个GUI来制定规则,将"规则"转换为Python脚本,调用。net中的Python脚本引擎来执行脚本。

我们要重新发明轮子吗?

如果没有现成的东西满足你的需要,那么No。

问题是,这些事情与企业的独特运作方式交织在一起,很难(如果不是不可能的话)有效地使用现成的解决方案。

我已经用两种不同的方法做过类似的事情。

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

在一个更早的VB6项目中,我使用了一个引导的VBScript来为高级用户提供编写某些规则的能力。尽管用户对Excel脚本很熟悉,并且编写了一个向导界面来帮助他们做他们需要做的事情,但他们通常只是让我编写规则。这个计划有点事与愿违,所以这就是为什么我后来没有再使用它,而是选择了一种更"选中这个,选择那个"的方法来构建规则。

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

你可以使用Drools Server来执行你的规则,并且仍然用。net或任何你喜欢的语言来做你的主应用程序。对于Drools Server部分,您仍然需要Java。