我要开始学习NRules了。下面是我正在构建的应用程序的一些关键要求的概要:
vehicle的类型是car时,应用所有适用于cars的规则”。vehicle;理想情况下,我不希望在启动时加载所有车辆的所有规则。这意味着规则应该组织成模块,在执行过程中以某种方式启用/禁用这些模块。我想到了几个解决办法:
有正确的方法来做我想做的事吗?
发布于 2018-11-12 03:13:42
在最高级别,有两种方法可以控制哪些规则被应用(甚至考虑到):
您提到的要求之一是甚至不加载不需要的规则。如果真是这样的话,我认为你是第二组解决方案中的一员。引擎没有任何内置机制来促进这种情况,所以您必须自己构建它。在我看来,您需要一组元规则,加载到他们自己的会话中,计算标准,然后使用这些规则加载特定的规则。例如,如果车辆是汽车,则有一个与其匹配的规则,并在会话中插入" car“标记。其他一些元规则可能会计算更多的标签。然后,您将使用计算的标记来加载其他规则集,例如,加载所有具有这些计算标记的规则,并将它们编译到单独的会话中,然后根据这些加载的规则运行事实。规则需要编译并加载到新会话中,因为一旦编译,会话工厂是不可变的,因此不能向其添加任何新规则。
如果您可以放宽不加载所有规则的要求,那么您还有几个选项。你已经触及了问题中的一些选项,但我认为你最好的选择是使用前向链接来实现你想要的。我个人认为这比尝试动态加载和编译规则要好。
例如,您可以有一条规则,如果车辆是一辆汽车,并且生成一辆新的实体车,那么特定于汽车的规则将在稍后使用:
Vehicle vehicle = null;
When()
.Match(() => vehicle, v => v.VehicleType == VehicleType.Car);
Then()
.Yield(_ => new Car(vehicle));然后,你的汽车专用规则看起来会是:
Car car = null;
When()
.Match(() => car)
//...在您的规则产生汽车事实之前,甚至不会对任何特定于汽车的规则进行评估。
https://stackoverflow.com/questions/52987277
复制相似问题