2013-07-11 55 views
0

我正在尝试编写一个C#应用程序,它需要数十万个独立的数据行,并根据用户定义的某些规则设置某个属性。正如我想到的使用规则引擎。经过一些Google搜索之后,我决定使用内置的Windows Workflow Foundation Rules EngineWindows工作流规则引擎可以处理分支吗?

用于创建规则的接口提供给在一个管道和过滤器样式的用户:

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

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

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

编辑:关于我所做的研究的其他细节。我搜索了很多博客文章/教程/ msdn资源,我可以在过去一周找到(没有使用链接,有吨,我使用了明显的关键字)。规则引擎规则集似乎专门用于顺序独立规则,并且当它们依赖时,它们通过更改某个变量(这是规则本身中的依赖项)来指示该事实,并导致对这些规则进行重新评估(完全类似于我相信RETE被称为全链式)。我无法看到一种根据其结构和关系动态地将依赖关系插入到我的规则中的方法。但是,我可以使用IfElse活动来模拟这种控制流程。

我已经实现了700行样本数据的小规则集并运行了一些测试。 (没有用于粘贴代码,我没有问题)他们评估的时间大约为50毫秒,而用IfElse Activities和相同规则构建的等效逻辑在aprox中进行评估。 2秒,我猜测它来自交换活动的开销。我要么没有正确地使用这些技术(我的意思是我没有意识到规则集的特性需要在独占分支中更好地评估,或者更快的切换活动),或者没有简单的方法来控制执行流规则集,因此我必须对这些活动产生巨大的性能损失。在这种情况下,我不妨写我自己的规则引擎。

编辑2:A diagram of the flow of execution I need from the ruleset

+0

向我们展示您在研究中所付出的一些努力,添加更多详细信息以改善您的更改以获得更好/更好的答案 –

+0

我已经为我的问题添加了更多详细信息,请让我知道是否有其他事情可能不会已经讨论过。 –

回答

0

对,所以我成功地把规则的固有顺序执行到hierarhical之一。

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


结构:

Rule_n由2个规则:

Rule_n_1的条件是:RuleIdToBeNextExecuted = N和(用户规则)

Rule_n_1的评价为True: RuleIdToBeNextExecuted =下一个动作/规则,如果Rule_n为真

Rule_n_1的评估假:没有采取任何行动。

Rule_n_2的条件是:RuleIdToBeNextExecuted = N和NOT(用户规则)

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

Rule_n_2的评估为False:不采取任何行动。


等效图的一个在这个问题:More states

这种结构允许我创建一个管道&滤波执行方式给用户的规则。

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

+2

你可以发布任何种类的代码工件,显示你如何实现这个? – Snowy

相关问题