使用 Microsoft 规则编辑器对规则集执行高级任务(预览版)

适用于:Azure 逻辑应用(标准)

重要

此功能为预览版,受 Azure 预览版补充使用条款约束。

本指南介绍可在 Microsoft 规则编辑器中对规则集执行的更高级操作。

先决条件

复制规则集版本

可以创建现有规则集版本的副本,但使用不同的版本号。

  1. 打开 Microsoft 规则编辑器。 在“规则集资源管理器”窗口中,打开规则集版本的快捷菜单,然后选择“复制”。

  2. 打开规则集的快捷菜单,然后选择“粘贴规则集版本”。

    Microsoft 规则编辑器会创建一个新的规则集版本,其元素与复制的版本相同,但编号不同。

    注意

    如果更新用​​于向规则集提供事实的 .NET 程序集,请确保更新规则集版本对该程序集的引用。 有关更多信息,请参阅更新 .NET 程序集引用

创建空规则集版本

将规则添加到规则集版本后,可以创建一个具有不同编号的新空规则集版本,并保存该版本以供以后使用。

  1. 打开 Microsoft 规则编辑器。 从规则集的快捷菜单中,选择“添加新版本”。

    Microsoft 规则编辑器将创建一个具有不同编号的新空规则集版本。

  2. 打开新规则集版本的快捷菜单,然后选择“保存”。

现在可以从其他规则集版本复制规则,并将其粘贴到新版本中。

将事实类型传递给规则集

尽管不能直接为规则集指定返回类型,但可以将以下类型的事实之一传递给规则集,让规则集将事实的值更改为 truefalse,然后在规则集执行后检查属性或元素/列的值:

  • 具有 Boolean 类型属性的 .NET 对象
  • 具有 Boolean 类型元素的 XML 文档

为规则集设置事实检索器

将事实检索器与规则集一起使用时,可以存储不经常更改的事实,使其存储在主机应用程序的第一个执行周期之前。 这样,就可以从存储中检索这些事实,将它们呈现给规则引擎一次以进行缓存,并在多个执行周期中重复使用它们。 有关更多信息,请参阅构建事实创建器和检索器

可以通过两种方法将事实检索器与规则集关联:

  • 在 Microsoft Rules Composer 中手动选择规则集版本的事实检索器。

  • 通过使用 RuleSetExecutionConfiguration 对象以编程方式执行此操作。

注意

只能将一个事实检索器实施与一个规则集版本关联。

手动为规则集选择事实检索器

  1. 打开 Microsoft 规则编辑器。 在“规则集资源管理器”中,选择要与事实检索器关联的规则集版本。

  2. 在“属性”窗口中,选择 FactRetriever 属性行,然后选择省略号按钮 () 以查找并选择现有事实检索器对象。

    注意

    在“属性”窗口中选择 FactRetriever 行后,才会显示省略号按钮 (…)。

从父规则集调用子规则集

对于此任务,请使用以下方法之一:

  • 直接从父规则集调用 Ruleset.Execute 方法。

  • 从父规则集中,调用包装 Ruleset.Execute 方法的辅助 .NET 组件的方法。

    使用第二种方法,可以将预处理和后处理代码添加到 Ruleset.Execute 方法中。 例如,可以在此包装器方法中创建子规则集所需的任何事实。 以下小节为每种方法提供了一个示例。

直接从父规则集调用 Ruleset.Execute 方法

本节提供使用 Ruleset.Execute 方法直接从父规则集调用子规则集的高级别步骤。 以下过程显示了将 Ruleset.Execute 方法作为操作添加到父规则集的步骤,该父规则集将 XML 文档作为事实传递给子规则集。

注意

在此示例场景中,XML 文档作为事实提交给父规则集。 此文档作为事实传递给子规则集。 但是,可以调用为子规则集创建事实的 .NET 方法。

  1. 打开 Microsoft 规则编辑器。 在“事实资源管理器”窗口中,选择“.NET 类”选项卡。

  2. 打开“.NET 程序集”的快捷菜单,然后选择“浏览”。

  3. 从“.NET 程序集”列表中,选择“Microsoft.RuleEngine”,然后选择“确定”。

  4. 展开“规则集”,然后将 Execute(Object facts)Execute(Object facts, IRuleSetTrackingInterceptor trackingInterceptor) 拖到“THEN”窗格。

  5. 选择“XML 架构”节点,打开“架构”的快捷菜单,然后选择“浏览”。

  6. 选择要作为事实传递的 XML 文档的架构,然后选择“打开”。​​

  7. 若要将传递给父规则集的 XML 文档作为事实传递到子规则集,请将 <schema-name>.xsd 拖到 Ruleset.Execute 方法中的第一个参数。

  8. 如果使用的 Execute 方法不将 IRuleSetTrackingInterceptor 作为第二个参数,请跳过以下步骤。

  9. 选择 .NET 类选项卡,然后将 Microsoft.RuleEngine 中的 DebugTrackingInterceptor 拖到 Ruleset.Execute 方法的第二个参数。

    注意

    如果执行此操作,客户端必须将 DebugTrackingInterceptor 类的实例作为事实传递给父规则集,然后父规则集将该实例作为事实传递给子规则集。 相反,可以拖动 DebugTrackingInterceptor 类的构造函数,以便自动为你创建实例。

修改调用父规则集的客户端应用程序

调用父规则集的客户端将创建一个规则集类的实例,并将子规则集名称作为参数,并将该实例作为事实与其他事实一起传递给父规则集。 下列示例代码阐释了这一操作:

DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt");
Ruleset Ruleset = new Ruleset("ParentRuleset");
object[] facts = new object[3];
facts[0] = txd;
facts[1] = new Ruleset("ChildRuleset");
facts[2] = new DebugTrackingInterceptor("RulesetTracking2.txt");
Ruleset.Execute(facts, dti);
Ruleset.Dispose();

如果客户端是 BizTalk 业务流程,可能需要将代码放入表达式形状中以创建事实,然后将事实作为参数传递给调用规则形状。

从父规则集调用 .NET 包装器方法

本节介绍调用 .NET 方法的高级别步骤,该方法包装从父规则集中对 Ruleset.Execute 方法的调用。

创建实用程序 .NET 类

  1. 创建 .NET 类库项目。 向项目中添加类。

  2. 添加一个调用 Ruleset.Execute 方法的静态方法,以便调用以名称作为参数传递的规则集,例如,如以下示例代码所示:

    public static void Execute(string RulesetName, TypedXmlDocument txd)
    {
        DebugTrackingInterceptor dti = new   DebugTrackingInterceptor("RulesetTracking.txt");
        Ruleset Ruleset = new Ruleset("ParentRuleset");
        object[] facts = new object[3];
        facts[0] = txd;
        facts[1] = new Ruleset("ChildRuleset");
        facts[2] = new DebugTrackingInterceptor("RulesetTracking2.txt");
        Ruleset.Execute(facts, dti);
        Ruleset.Dispose();
    }
    

    客户端调用父规则集,父规则集调用调用子规则集的辅助方法,例如以下客户端的示例代码所示:

    facts[0] = txd;
    facts[1] = new RulesetExecutor(txd);
    
    // Call the first or parent ruleset.
    Ruleset Ruleset = new Ruleset(RulesetName);
    DebugTrackingInterceptor dti = new DebugTrackingInterceptor("RulesetTracking.txt");
    Ruleset.Execute(facts, dti);
    Ruleset.Dispose();
    

    注意

    如果该方法是一个实例方法,则客户端必须创建帮助程序 .NET 类的一个实例,并且将该实例作为事实传递到父规则集。

在规则中分析相同类型的多个对象

在许多情况下,你会针对某个类型编写业务规则,并期望引擎分别分析并处理断言到引擎中的该类型的每个实例。 但是,在某些情况下,你希望引擎同时分析相同类型的多个实例。 例如,以下示例规则使用 FamilyMember 类的多个实例:

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

该规则标识多个 FamilyMember 实例,其中一个是 Father,另一个是 Son。 如果实例与姓氏相关,则规则会将 Son 实例添加到 Father 实例上的子项集合中。 如果引擎单独分析每个 FamilyMember 实例,则规则永远不会触发,因为在这种情况下,FamilyMember 只有一个角色,即 FatherSon

因此,在这种情况下,必须指示引擎在规则中一起分析多个实例,并且需要一种方法来区分规则中每个实例的身份。 可以使用“实例 ID”字段来提供此功能。 在“事实资源管理器”中选择事实时,此字段在“属性”窗口中可用。

重要

如果选择使用“实例 ID”字段,请确保在将事实或成员拖入规则之前更改其值。

使用“实例 ID”字段时,规则将重建。 对于使用 FamilyMember 类的 Son 实例的规则参数,将“实例 ID”值从默认值“0”更改为“1”。 将“实例 ID”值从“0”更改为“1”并将事实或成员拖入规则编辑器时,“实例 ID”值将显示在类后面的规则中,例如:

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

现在,假设向引擎中添加了一个 Father 实例和一个 Son 实例。 引擎将根据这些实例的不同组合来为规则求值。 假设 Father 实例和 Son 实例的姓氏相同,则会按预期方式向 Father 实例添加 Son 实例。

注意

实例 ID”字段仅在特定规则求值的上下文中使用。 此字段不固定在规则集执行中的对象实例上,并且与用于为对象求值的顺序无关。 每个对象实例均使用该类型的所有规则参数求值。