我正在尝试编写一个C#应用程序,它接收数十万个独立的数据行,并根据用户定义的某些规则设置某个属性。因此我想到了使用规则引擎。经过一些谷歌搜索后,我决定使用内置的Windows Workflow Foundation Rules Engine。
用于创建规则的界面以管道和过滤器样式呈现给用户:
原始数据 - > rule1 - >如果规则1的结果为True,则执行rule2 /如果规则1的结果为False,则执行规则3 - > ......执行其他规则的分支...... - >根据所采取的分支,属性设置为某个值。
我希望能够以类似的管道和过滤器/分支样式执行规则,而不是按照非链规则集的顺序执行。我不知道如何为链接规则集创建依赖关系来匹配我的流。我意识到WF专门针对这种类型的分支进行IfElse活动,它支持类似的规则,但工作流程活动慢了两个数量级。
我是否错误地使用了这些技术? (我是C#的新手)我应该考虑编写自己的规则引擎吗?任何建议都表示赞赏。
编辑:我已完成的有关研究的其他详细信息。我已经google了,阅读了过去一周我可以找到的大多数博客文章/教程/ msdn资源(没有使用链接,有吨,我使用了明显的关键字)。规则引擎规则集似乎专门用于顺序独立规则,当它们依赖时,它们通过更改某个变量来表示该事实,该变量是规则本身的依赖性并导致重新评估这些规则(类似于RETE称为全链接我相信)。我看不到根据结构和关系动态地将依赖项插入到我的规则中的方法。但是,我可以使用IfElse Activities对此控制流进行建模。
我已经实现了一个包含700行样本数据的小规则集并运行了一些测试。 (没有用于代码粘贴,我没有问题)他们在~50毫秒内评估,而使用IfElse活动和相同规则构建的等效逻辑在aprox中评估。 2秒,我猜测是来自切换活动的开销。我要么没有正确使用这些技术(我的意思是我不知道规则集的属性要在独占分支中更好地评估,或者更快的切换活动)或者没有简单的方法来控制执行流程因此,我必须对这些活动产生很大的性能损失。在这种情况下,我不妨编写自己的规则引擎。
编辑2:A diagram of the flow of execution I need from the ruleset
答案 0 :(得分: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的评价为假:未采取任何行动。
问题中的等效图:
这种结构允许我根据用户的规则创建管道和过滤器执行方法。
研究:我自己的数据结构设计。