我们有业务要求让高级用户编辑保险费率和注册规则。我们需要一个网络ui,让他们说“这个产品只适用于人们<55,除非他们来自德克萨斯州并拥有一只贵宾犬”或其他什么。编辑澄清:保险是疯了。规则因产品,产品状态和状态不同而不同。
我们查看了几个规则引擎,但是商业规则引擎是100K +,开源代码似乎不是,完成了。如果我们提前创建规则,Windows Workflow会起作用,但在运行时构建它们似乎需要绕过代码访问安全性。那太可怕了。
我们难以重新发明这个轮子吗? .net是否有更好的选择?
答案 0 :(得分:10)
我认为,与大多数制作和购买决策一样,您必须亲自做出权衡。如果你购买一个现成的解决方案,这个解决方案的成本是100K +而且你只会使用它的1%,那可能是一些不明智的花费。但是,如果产品非常合适,那么几乎可以肯定的是,您永远不能以更低的价格构建产品(假设他们在该特定领域拥有丰富的经验)。
所以,只要你没有试图完成搁置产品所做的一切,只关注你需要的特定功能而不是让自己受到构建的想法的诱惑,你就不会疯狂地重新发明这个轮子。非常好(但价格昂贵)的框架非常简单。
答案 1 :(得分:10)
我认为对规则的评估不会是挑战。我认为更大的挑战是解析用户可以输入的规则。要解析规则,您应该考虑创建一些DSL。 Martin Fowler对此here有一些想法。那么也许ANTLR可能值得一看。
对于评估部分:我在金融行业工作,也有复杂的规则,但我从来不必使用规则引擎。命令式编程语言(在我的情况下是C#)的手段(直到现在)已经足够了。在某些情况下,我正在考虑使用规则引擎,但规则引擎的技术风险(*)总是高于预期的收益。这些规则(直到现在)从未如此复杂,需要声明性编程模型。
如果您使用的是面向对象语言,可以尝试应用Specification Pattern。 Eric Evans和Martin Fowler写了更详细的解释,你可以找到here。或者,您可以编写自己的简单规则引擎。
(*)脚注:不知何故,您需要将规则引擎嵌入到您的应用程序中,这很可能是用面向对象的语言编写的。所以有一些技术边界,你必须弥合。每一座这样的桥梁都是技术风险。我曾经见过一个使用C编写的规则引擎的Java Web应用程序。一开始,C程序有时会产生核心转储并破坏整个Web应用程序。
答案 2 :(得分:3)
答案 3 :(得分:2)
这不是我的领域,我偶然遇到了这个问题,所以我可能会离开,但我会看看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的那个慢一个数量级左右。但这主要是针对数值/计算或数据操作相关的问题,所以我认为问题本质上是基于规则,性能差距可能小一点
我确信的一件事是,在Mathematica中,您可以使用少量代码轻松地创建任何通用性和复杂性的规则集。它是基于我到目前为止遇到的规则进行探索性编程的最佳工具,开发周期非常短。我邀请您访问此处的Mathematica tag,了解人们正在解决的问题类型。对于一个完全用Mathematica语言编写的着名项目(1500万行代码),请查看WolframAlpha知识引擎。
答案 4 :(得分:1)
对.net有更好的选择吗?
一种选择是在.net代码中使用嵌入式脚本引擎,如Iron Python。为用户提供GUI制定规则,将“规则”转换为Python脚本,调用.Net内部的Python脚本引擎来执行脚本。
我们是不是要重新发明这个轮子?
如果现成的任何东西都不符合您的需求,那么
答案 5 :(得分:0)
问题在于,这些事情与企业如何独特运作密切相关,即使不是不可能,也很难有效地使用现成的解决方案。
我做了两件不同的事情。
最新的(在VS 2005 / Framework 2.0中)是创建一个基本引擎来处理全面的常见最低要求。这将是名称,地址等等。然后我写了一系列扩展DLL,使用通用接口将通过反射加载特定类型/区域,例如,通过状态或产品线。高级用户可以使用简单的应用程序来创建他们需要的帐户配置(配置存储在数据库中)。如果事情发生了变化,可以修改底层DLL或添加新的DLL。在我参与这个项目的4年中,我只需要添加一个新的扩展DLL,但通常每个规则需要一两个小mod。
在早期的VB6项目中,我使用了引导式VBScript为高级用户提供了编写某些规则的能力。虽然用户很了解Excel脚本并且编写了向导界面来帮助他们完成他们需要做的事情,但他们通常只是给了我编写规则的工作。这个计划有点适用,所以我之后不再使用它,而是选择了更多“检查,选择那种”规则建设的方法。
答案 6 :(得分:0)
如果规则很简单,编写自己的引擎就可以了。它们越复杂,维护它所需的时间就越多。
您可以使用Drools Server执行规则,并使用.NET或您喜欢的任何语言继续执行主应用程序。你仍然需要Java用于Drools Server部分。