如何为我的应用程序添加可编程性

时间:2010-01-08 19:34:48

标签: c# .net .net-3.5 scripting

我正在编写一个应用程序,它的核心是一个规则引擎。用户希望能够定义自定义规则。其中一些将是相当简单的代数表达式,许多将涉及一些if-then分支逻辑,而一些将更复杂。这样做有什么选择?

我的用户非常聪明,精通T-SQL和Excel命令,并且通常熟悉编程结构,但他们不是“程序员”本身

我考虑过使用VBA / VSTA;以某种方式与Excel互操作;集成某种脚本语言(Ruby?Perl?Tcl?);或者自己动手。

在所有可能的世界中,我将为他们提供一个带有颜色编码和类似智能感知的交互式帮助的编辑器,一个用于测试和试验的即时执行模式,以及一个逐步调试器。他们还需要能够保存,检索,编辑和执行他们的规则。炽热的速度并不重要。

我的环境是Windows / .Net 3.5 / C#

有什么想法吗?

13 个答案:

答案 0 :(得分:5)

我不是一个Windows用户,所以我的答案不会完全适合你的情况。我建议在您的应用程序中嵌入一个完整的脚本语言解释器。暴露一些原语(即你想要公开的规则引擎的部分),然后提供一个完整的解释器。我知道TCL,Python和Guile旨在以这种方式嵌入。我个人推荐Python,因为Scheme(guile)有点深奥,TCL似乎一般都会失败。

答案 1 :(得分:3)

任何类似的实施都充满了风险。我将从尽可能小的自定义开始,然后从那里逐步建立您的功能。

不要试图将各种可扩展性一次性编入其中,除非你已经掌握了很多技巧。一次选择一个简单的能力 - 运行标准SQL查询和返回记录集或其他任何内容。

答案 2 :(得分:2)

这不是你要求的全部,但我会根据你的需要调查Boo。在Boo中构建一个对业务人员来说相对可读的DSL是相对轻松的,即使他们不是直接编码规则的人也有很大的好处。

Oren Eini在Boo中构建领域特定语言非常好,刚刚以最终形式出现。规则引擎是他检查的DSL的示例实现之一。 Boo是.Net的一个完全构建的静态类型的Python类语言,具有一个小而强大的社区,并且由于可扩展的编译器管道和非常好的语义,因此可以比几乎所有其他替代方案更容易地更改语言以满足特定需求。 - 智能宏系统。

Boo的优点在于,大多数DSL都是基于一个提供所需“语言”的公共基类构建的,但与您编写硬编码规则的代码差别不大。您可以使语言看起来完全符合您的要求,但不必担心手工解析或编写控制流命令或您希望语言具有的所有内容。

有一些缺点:它不像Python或Ruby,文档主要是Boo的源代码,社区是,小,是。但如果你能“通过实例教学”,你可以走得很远。适用于您的愿望清单的主要警告是代码完成;代码完成对一些VS插件和SharpDevelop的支持有限,但是当你构建DSL时,几乎消失了。

答案 3 :(得分:2)

由于.NET是您的平台,因此嵌入ironpython可能对您有用。事实上,其中一本铁皮书籍的作者在一种似乎(表面上)与你正在做的事情有很多相似之处的产品中使用了铁屑。我认为它被称为Resolver One。

修改

名为Resolver One

这是指向book的链接。

答案 4 :(得分:0)

不要发明自己的脚本语言!学习单个系统的新语言是不好的。我尝试使用相对容易学习和理解的Python。

答案 5 :(得分:0)

Windows内置Windows Script Host引擎,带有两个VBScript和JScript解释器。您可以轻松使用它们。只需查看MSDN以获取适当的COM接口。

答案 6 :(得分:0)

Lua可能是一个很好的解决方案。我真正想知道的是,将规则引擎与允许用户编写自己的规则的脚本语言集成是多么复杂。

一个好的方法可以是在脚本解释器中嵌入所有内容(规则引擎),否则最终会编写大量代码来桥接用户使用程序中使用的相关规则写入脚本的内容。

然而,设计这样的可编程性需要非常注意您的语言应该能够做什么,从一小部分实用工具开始然后扩展它;或者你可以在开始整个实现之前做很多计划但是根据我的经验(我到目前为止编写了3-4个解释器)更好的方法是在开发它时适应它,当然还有用户的反馈:它将是必要的,因为你可以假设它们有多好,但我不会指望它。

答案 7 :(得分:0)

对于诚实的上帝规则引擎,您可以考虑使用Clips。 Clips是一个OpenSource专家系统,您可以将其嵌入到自己的应用程序中。

如果你想要真正的脚本,那么有很多工具可以用Lua,TCL,REXX等语言添加到脚本中。

无论你做什么,都应该仔细检查许可。将其他人的代码嵌入您的代码中通常会对如何授权生成的程序产生影响。

答案 8 :(得分:0)

根据经验说,因为我们的主要软件具有脚本功能。

我们使用Actipro SyntaxEditor作为脚本设计器。我们原来的要求是“用户应该能够为字段编写公式。该公式将用于验证字段的内容。”

由此,我们使用了Dynamic Linq。用户能够在仍然能够添加数学函数和自定义函数的同时编写公式。我们当时并不需要更多,但现在看到使用Dynamic Linq的限制。

如果我们要制作新版本的脚本引擎,我们现在期待使用新的支持DLR的语言:IronPythonIronRuby

答案 9 :(得分:0)

我们目前使用Mozilla的SpiderMonkey在我们的Web应用程序中执行此操作。它是一个javascript引擎,因此您可以创建自己的功能和对象,这些功能和对象与应用程序中的实际业务逻辑相对应。 Javascript :: SpiderMonkey是一个接口的perl模块,但我相信有更多语言可以使用它。

答案 10 :(得分:0)

如果清楚地理解了结构和规则,那么我将模仿Lucene(java和.net)中包含的Query接口。基本上,您的规则变成了查询类型,您可以和Lucene一样和/或它们一起使用它们。

最后,您可以创建一个允许用户执行此工作的界面。关键部分将是查询类型和关联的元数据,它们可以作为要采取行动的项目。

例如,假设您的规则引擎是电子商务引擎,并且您允许您的用户定义规则,如果他们将特定产品添加到购物篮中,则会以折扣奖励客户。

他们会选择一种与产品编号匹配的ProductQuery,然后成功完成productquery将导致自动应用折扣奖励。

希望这有帮助。

答案 11 :(得分:0)

正如其他人所说,LUA是一种在您的应用程序中嵌入脚本语言的快捷方式。我们公司的产品具有宏功能,我简单地接受了将完整脚本支持作为其一部分嵌入的想法。但最终我们决定火车将是一场噩梦。

无论如何,如果您选择该路线,这是对c#中嵌入式LUA的一个很好的介绍: http://blog.apterainc.com/software/embedding-lua-and-c/

答案 12 :(得分:0)

考虑编写图形语言或工具,而不是嵌入式scipting语言,如果您可以识别所有可能的规则并将它们映射到适当的代码,您可以提供给最终用户一个简单&添加行为的简便方法&以可视方式对他们的工作流程采取行动。

提供基于UI的规则引擎更加简单易学;非程序员更方便。并且您始终可以添加嵌入式脚本语言,以自定义预先存在的操作,后者。

此外,它是ETL中用于示例的常用工具,用于创建业务规则