.NET的规则引擎

26

我们有一个业务需求,要让高级用户编辑保险费率和注册规则。我们需要一个Web界面,让他们可以说“这个产品只适用于<55岁的人,除非他们来自德克萨斯州并拥有一只贵宾犬”或者其他什么条件。澄清一下:保险是非常复杂的。规则因产品、州份而异,并且经常变化。

我们看了几个规则引擎,但商业引擎价格在10万美元以上,开源引擎似乎不太完善。如果我们预先创建规则,则Windows Workflow可以工作,但在运行时构建规则似乎需要绕过代码访问安全性,这很危险。

重新发明这个轮子会是一个疯狂的想法吗?.net是否有更好的替代方案?


5
一些最好的事情是因为疯狂而完成的,如果你们自己写了的话,也许它可以成为一个独立的产品,每次销售能带给你们10万美元的收入。 - David Anderson
2
你知道的...如果你在使用Java的话... :) - Perception
3
哈哈,值得怀疑。当你有机会时,认真看一下 Drools。 - Perception
4
你看过 http://rule.codeeffects.com 吗?我认为它正是你所要求的。 - Kizz
1
你尝试过 FlexRule 吗?它是最实惠的商业规则引擎,支持所有复杂的规则和逻辑,并配备优化算法。例如 RETE。 - Arash Aghlara
显示剩余2条评论
7个回答

13

我认为评估规则不是问题,更大的挑战是解析用户输入的规则。为了解析规则,你应该考虑创建一些DSL。Martin Fowler在这里提出了一些想法。然后,ANTLR也值得一看。

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

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

(*)注:无论如何,您都需要将规则引擎嵌入到应用程序中,而这很可能是用某种面向对象语言编写的。因此,有一些技术上的障碍需要克服。每个这样的桥梁都是一个技术风险。我曾经见过一个Java Web应用程序使用用C编写的规则引擎。在开始时,C程序有时会产生核心转储并拆除整个Web应用程序。


10

我认为像大多数制造 vs 购买的决策一样,这总是需要你个人做出权衡。如果你购买一个成本超过100K的现成解决方案,而你只会使用其中的1%,那么这可能是一笔不明智的花费。然而,如果产品完全符合要求,那么你几乎可以确定你永远无法以更少的费用来构建它(假设他们在该特定领域拥有丰富的经验)。

因此,只要你不试图尝试复制现成产品的全部功能,而是专注于你所需的特定功能,并不被构建非常漂亮(但昂贵)的框架的想法所诱惑,那么重新发明轮子并不疯狂。


3

100K并不是小数目,但一名合格的程序员的薪资几乎肯定会超过这个数 - 你有没有能够以更便宜的价格雇佣一名程序员来完成这个任务?他们是否能够在一年内完成任务?同时,他们的工作质量(适合你的需求)是否和那些薪资更高的程序员一样好或更好?


2
这不是我的专业领域,我偶然看到了这个问题,所以可能会有偏差,但我建议看一下Wolfram Mathematica。它是一个技术计算环境和多范式(专有)编程语言,支持许多编程风格(包括基于规则和函数式编程)。它的核心具有非常通用的规则引擎。尽管它的名字和声誉是数学软件(它确实是),但它是一种通用的高级编程语言。它的子集可以编译成C。它可以动态加载外部dll,并且与Java和.Net平台之间无缝地互操作。它还有一个网络版本 - webMathematica(基于Java,jsp+Tomcat,但你也可以直接将其与基于.Net的Web层接口化,只需要更多的工作)。额外的好处是,如果您需要任何数学计算、分析、绘图、统计,它都具备,并且是最先进的。
我认为在Mathematica中开发所需的功能比许多其他语言/解决方案要快得多(我专业使用Mathematica、C、Java和Javascript进行编程,因此可以至少比较这些语言)。完整的商业许可证应该是单机(4核)2或3千美元。它具有几个并行化功能。在这种方法中最困难的事情将是找到一位称职的Mathematica程序员,但具有函数/基于规则的编程背景(例如LISP / Prolog)的人应该能够相当快地掌握。此外,如果需要非常高的性能,则可能不足够快-我真的不知道它在性能方面与其他规则引擎相比如何。偶尔,我有机会在Mathematica中将某些问题的基于规则的解决方案与编译为C的解决方案进行比较,我会说,编写良好的基于规则的代码在性能方面应该与Python相当,并且平均而言可能比编译为C的代码慢一个数量级左右。但那主要是针对数值/计算或数据操作相关问题,因此我认为对于固有基于规则的问题,性能差距可能会更小。
我确信的一件事是,在Mathematica中,你可以轻松地创建任何广泛和复杂程度的规则集,只需少量代码即可。这是我迄今为止遇到的基于规则的探索性编程的最佳工具,开发周期非常短。我邀请您访问SO上的Mathematica标签,看看人们正在用它解决哪些问题。对于一个完全使用Mathematica语言编写的著名项目(1500万行代码),请查看WolframAlpha知识引擎。

当然,使用版本8,Mathematica函数可以被编译成动态库的本机代码形式,然后再链接回来。 - rcollyer
@rcollyer 一些 Mathematica 函数,但不包括基于规则和模式的函数。 - Leonid Shifrin

1

有没有比 .net 更好的替代品?

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

我们重新发明这个轮子是疯了吗?

如果没有现成的产品符合您的需求,那么不会。


0
问题在于这些事情与业务的独特运作方式紧密相连,如果不是不可能,就很难有效地使用现成的解决方案。
我已经用两种不同的方法做过类似的事情。
最近一次(在VS 2005/Framework 2.0中)是创建一个基础引擎,处理跨越各个领域的共同最低要求。这将是像名称、地址等东西。然后,我编写了一系列扩展DLL,使用常见接口通过反射加载特定类型/区域,例如按州或产品线。高级用户可以使用简单的应用程序创建他们需要的帐户配置(配置存储在数据库中)。如果有变化,底层DLL可以被修改或添加新的DLL。在我参与这个项目的4年中,我只需要添加一个新的扩展DLL,但通常每个月需要对规则进行一到两个小修改。
在一个早期的VB6项目中,我使用了引导式VBScript来为高级用户提供编写某些规则的能力。虽然用户很熟悉Excel脚本,并编写了向导界面来帮助他们完成所需的操作,但他们通常只是把编写规则的工作交给了我。这个计划有点失败了,所以我后来没有再使用它,而是选择了更多的“检查这个,选择那个”的规则构建方法。

0
编写自己的引擎在规则简单时是可行的。但当规则变得更加复杂,就需要花费更多时间来维护它。
您可以使用Drools服务器执行规则,仍然可以使用.NET或任何您喜欢的语言编写主要应用程序。但是,Drools服务器部分仍然需要使用Java。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接