业务规则框架提供了一个高效推理引擎,能够将规则链接到 .NET 对象、XML 文档或数据库表。
业务规则引擎使用三阶段算法来执行策略。 这些阶段包括:
匹配。 在匹配阶段,使用规则条件中定义的谓词,将事实与使用事实类型(规则引擎工作内存中维护的对象引用)的谓词进行匹配。 为了提高效率,模式匹配发生在策略中的所有规则上,并且跨规则共享的条件仅匹配一次。 部分条件匹配可以存储在工作内存中,以加快后续模式匹配作。 模式匹配阶段的输出由规则引擎议程的更新组成。
冲突解决。 在冲突解决阶段,将检查候选执行的规则,以确定根据预先确定的解决方案来执行下一组规则动作。 在匹配阶段中找到的所有候选规则都会添加到规则引擎的议程中。
默认冲突解决方案基于策略中的规则优先级。 优先级是业务规则编辑器中规则的可配置属性。 数字越大,优先级越高:因此,如果触发了多个规则,则首先执行高优先级作。
行动。 在操作阶段,将执行已解析规则中的动作。 请注意,规则动作可以将新事实断言到规则引擎中,这会导致循环继续。 这也称为正向推理。 请务必注意,算法永远不会抢占当前正在执行的规则。 在重复匹配阶段之前,将执行当前触发的规则的所有操作。 在比赛阶段再次开始之前,议程上的其他规则不会被执行。 匹配阶段可能导致议程上的这些规则在触发之前从议程中删除。
以下示例显示了匹配-冲突解决-动作的三阶段算法。
规则 1:计算收入
声明性表示形式:
只有在申请人的收入贷款比率低于0.2时,才应获得申请人的信用评级。
IF - THEN 表示形式,使用业务对象:
IF Application.Income / Property.Price < 0.2 THEN Assert new CreditRating( Application)
规则 2:计算信用等级
声明性表示形式:
只有在申请人的信用评级超过725时,才应批准申请人。
使用业务对象的 IF-THEN 表示:
IF Application.SSN = CreditRating.SSN AND CreditRating.Value > 725 THEN SendApprovalLetter(Application)
下表汇总了事实。
事实 | 领域 |
---|---|
应用程序 - 表示房屋贷款应用程序的 XML 文档 | - 收入 = $65,000 - SSN = XXX-XX-XXXX |
物业 – 用于表示所购房产的 XML 文档 | - 价格 = $225,000 |
CreditRating - 包含贷款申请人信用评级的 XML 文档 | - 值 = 0 – 800 - SSN = XXX-XX-XXXX |
最初规则引擎的工作内存和议程为空。 应用程序添加“应用程序和属性”事实后,规则引擎的工作内存和议程将按如下方式更新。
工作内存 | 日程 |
---|---|
-应用 -财产 |
规则 1 |
规则 1 已添加到议程中,因为它的条件(Application.Income / Property.Price < 0.2)在匹配阶段评估为 为真。 工作内存中没有 CreditRating 事实,因此规则 2 的条件未被评估。 因为议程中唯一的规则是规则 1,因此该规则被执行后就从议程中消失了。 为规则 1 定义的单一操作导致将新的事实(申请人的信用评级文档)添加到工作记忆中。 执行规则 1 完成后,控件将返回到匹配阶段。 由于唯一要匹配的新对象是 CreditRating 事实,因此匹配阶段的结果如下所示。
工作内存 | 日程 |
---|---|
-应用 -财产 - 信用评级 |
规则 2 |
此时执行规则 2,导致调用向申请人发送审批信的函数。 规则 2 完成后,正向链推算法的执行返回匹配阶段。 由于不再有新的事实可供匹配,并且议程为空,因此正向推理终止,策略执行完成。