0

我正在尝试编写一个 C# 应用程序,该应用程序接收数十万个独立的数据行,并根据用户定义的某些规则设置某个属性。因此,我考虑过使用规则引擎。经过一番谷歌搜索,我决定使用内置的Windows Workflow Foundation Rules Engine

用于创建规则的界面以管道和过滤器样式呈现给用户:

原始数据 -> 规则 1 -> 如果规则 1 的结果为真,则执行规则 2 / 如果规则 1 的结果为假,则执行规则 3 -> ...执行其他规则的分支 ... -> 取决于所采用的分支,属性设置为某个值。

我希望能够以类似的管道和过滤器/分支样式执行规则,而不是像非链接规则集那样按顺序执行。我不确定如何为链接规则集创建依赖项以匹配我的流程。我意识到 WF 有专门针对这种类型的分支的 IfElse 活动,它支持类似的规则,但工作流活动要慢两个数量级。

我是否错误地使用了这些技术?(我是 C# 新手)我应该考虑编写自己的规则引擎吗?任何建议表示赞赏。

编辑:有关我所做研究的其他详细信息。我搜索并阅读了过去一周我能找到的大多数博客文章/教程/msdn 资源(没有用链接,有很多,而且我使用了明显的关键字)。规则引擎规则集似乎专门用于顺序独立规则,当它们相互依赖时,它们通过更改规则本身的依赖项并导致重新评估这些规则(尽管类似于我相信RETE称为全链)。我看不到一种根据它们的结构和关系动态地将依赖项插入到我的规则中的方法。但是,我可以使用 IfElse 活动对这种控制流进行建模。

我已经实现了一个包含 700 行样本数据的小规则集并运行了一些测试。(在代码中粘贴没有用,我对此没有问题)它们在约 50 毫秒内评估,而使用 IfElse 活动和相同规则构建的等效逻辑在 aprox 中评估。2 秒,我猜这是来自切换活动的开销。我要么没有正确使用这些技术(我的意思是我不知道要在独占分支中分层评估的规则集的属性,或者更快的切换活动),要么没有简单的方法来控制执行流程。规则集,因此我必须对这些活动造成很大的性能损失。在这种情况下,我不妨编写自己的规则引擎。

编辑 2:我需要来自规则集的执行流程图

4

1 回答 1

0

是的,所以我设法将规则的固有顺序执行变成了分层的。

这是通过使用一个额外的外部变量来实现的,该变量用作下一次执行的规则 ID,并将规则数量加倍(这些额外的“执行流控制”规则对用户隐藏)。这使我的执行时间加倍,但与使用 IfElse 活动相比仍然可以接受。一分钟内可以处理大约 1000000 行数据。


规则的结构:

Rule_n 由 2 条规则组成:

Rule_n_1 的条件是:RuleIdToBeNextExecuted = n AND(用户的规则)

Rule_n_1 的评估为 True:RuleIdToBeNextExecuted = 如果 Rule_n 为 True,则为下一个操作/规则

Rule_n_1 的评估为假:未采取任何措施。

Rule_n_2 的条件是:RuleIdToBeNextExecuted = n AND NOT(用户的规则)

Rule_n_2 的评估为 True:RuleIdToBeNextExecuted = 如果 Rule_n 为 False,则为下一个操作/规则

Rule_n_2 的评估为 False:未采取任何措施。


与问题中的等效图:更多州

这种结构允许我为用户的规则创建管道和过滤器执行方法。

研究:我自己的数据结构设计。

于 2013-07-12T16:19:11.723 回答