如何在业务规则中分析同一类型的多个对象

在许多情况下,你将针对某个类型编写业务规则,并且期望被断言到引擎中的每个实例单独分析并按照规则采取行动。 但是,在某些情况下,需要在规则中同时分析给定类型的多个实例。

以使用 FamilyMember 类实例的规则为例。

IF FamilyMember.Role == Father  
AND FamilyMember.Role == Son  
AND FamilyMember.Surname == FamilyMember.Surname  
THEN FamilyMember.AddChild(FamilyMember)  

该规则标识一个 FamilyMember 实例,该实例是 一个父亲 ,另一个实例是 Son。 如果实例按姓氏关联,Son 实例将被添加到 Father 实例的子集合中。 如果规则中单独分析了每个 FamilyMember 实例,则规则永远不会触发,因为在这种情况下, FamilyMember 只有一个角色(父亲儿子)。

因此,必须向引擎指示应在规则中一起分析多个实例,并且需要一种方法来区分规则中每个实例的标识。 实例 ID 属性用于提供此功能。 在“事实资源管理器”中选择事实时,此字段在“属性”窗口中可用。 在将事实或成员拖动到规则之前,应更改字段值。

使用 实例 ID 属性,将重新生成规则。 对于使用 FamilyMemberSon 实例的规则参数,实例 ID 字段从默认值 0 更改为 1。 当实例 ID 被从 0 更改为其他值时,并且事实或成员被拖动到规则编辑器中,实例 ID 的值将在类之后的规则中显示。

IF FamilyMember.Role == Father  
AND FamilyMember(1).Role== Son  
AND FamilyMember.Surname == FamilyMember(1).Surname  
THEN FamilyMember.AddChild(FamilyMember(1))  

现在,假设向引擎中添加了一个 Father 实例和一个 Son 实例。 引擎将根据实例的各种组合评估规则。 假设 FatherSon 实例具有相同的姓氏, 则 Son 实例将按预期添加到 Father 实例。

注释

实例 ID 仅在给定规则评估的上下文中使用。 它不会附加到策略执行中的对象实例,并且与断言对象的顺序无关。 将评估该类型的所有规则参数中的每个对象实例。