首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NRules:如何在模块中组织规则并启用/禁用其他规则

NRules:如何在模块中组织规则并启用/禁用其他规则
EN

Stack Overflow用户
提问于 2018-10-25 10:38:54
回答 1查看 1K关注 0票数 0

我要开始学习NRules了。下面是我正在构建的应用程序的一些关键要求的概要:

  1. 一些规则决定是否应适用其他规则组。例如(在伪代码中):“当vehicle的类型是car时,应用所有适用于cars的规则”。
  2. 有些规则将确定应排除特定规则。
  3. 可能有多种类型的vehicle;理想情况下,我不希望在启动时加载所有车辆的所有规则。

这意味着规则应该组织成模块,在执行过程中以某种方式启用/禁用这些模块。我想到了几个解决办法:

  • 标记规则并使用议程筛选器过滤规则,这取决于用于启用/禁用规则的服务。我已经尝试过了,但它并不像我想的那样工作,因为引擎不会对服务进行更改。
  • 添加确定是否应应用规则的规则,并在每个规则的匹配条件中使用此规则。这会导致在每条规则中重复大量代码,我不太喜欢这些代码。
  • 在规则执行期间加载新的规则组。我不知道如何做到这一点,如果它是推荐的,或应该被期待的工作。

有正确的方法来做我想做的事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-12 03:13:42

在最高级别,有两种方法可以控制哪些规则被应用(甚至考虑到):

  1. 将所有规则加载到会话中,并在规则的逻辑中处理它。
  2. 将规则组加载到不同的会话中,并有某种元规则将控件分派给相应的子集规则。

您提到的要求之一是甚至不加载不需要的规则。如果真是这样的话,我认为你是第二组解决方案中的一员。引擎没有任何内置机制来促进这种情况,所以您必须自己构建它。在我看来,您需要一组元规则,加载到他们自己的会话中,计算标准,然后使用这些规则加载特定的规则。例如,如果车辆是汽车,则有一个与其匹配的规则,并在会话中插入" car“标记。其他一些元规则可能会计算更多的标签。然后,您将使用计算的标记来加载其他规则集,例如,加载所有具有这些计算标记的规则,并将它们编译到单独的会话中,然后根据这些加载的规则运行事实。规则需要编译并加载到新会话中,因为一旦编译,会话工厂是不可变的,因此不能向其添加任何新规则。

如果您可以放宽不加载所有规则的要求,那么您还有几个选项。你已经触及了问题中的一些选项,但我认为你最好的选择是使用前向链接来实现你想要的。我个人认为这比尝试动态加载和编译规则要好。

例如,您可以有一条规则,如果车辆是一辆汽车,并且生成一辆新的实体车,那么特定于汽车的规则将在稍后使用:

代码语言:javascript
复制
Vehicle vehicle = null;
When()
    .Match(() => vehicle, v => v.VehicleType == VehicleType.Car);

Then()
    .Yield(_ => new Car(vehicle));

然后,你的汽车专用规则看起来会是:

代码语言:javascript
复制
Car car = null;
When()
    .Match(() => car)
    //...

在您的规则产生汽车事实之前,甚至不会对任何特定于汽车的规则进行评估。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52987277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档