从其他策略调用策略

您可以通过使用以下方式之一从其他策略(父策略)调用策略(子策略):

  • 直接从父策略调用 Policy.Execute 方法

  • 从父策略调用包装 Policy.Execute 方法的帮助程序 .NET 组件的方法

    使用第二种方法的优点是,可以将预处理和后处理代码添加到 Policy.Execute 方法。 例如,您可以在此包装程序方法中创建子策略所需的任何事实。 下面几部分将为每个方法提供一个示例。

直接从父策略调用 Policy.Execute 方法

本部分介绍直接使用 Policy.Execute 方法从父策略调用子策略的高级步骤。

向父策略添加 Policy.Execute 操作

以下过程包含将 Policy.Execute 方法作为操作添加到父策略的步骤,该父策略将 XML 文档作为事实传递给子策略。

将 Policy.Execute 方法作为操作添加到某一策略
  1. 在“事实资源管理器”窗口中,单击“ .NET 类 ”选项卡。

  2. 右键单击“ .NET 程序集”,然后单击“ 浏览”。

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

  4. 展开 “策略”。

  5. 将“执行 (对象事实) ”或“执行 (对象事实、IRuleSetTrackingInterceptor trackingInterceptor) ”拖动到“THEN”窗格。

  6. 单击“ XML 架构” 节点。

    注意

    在此示例方案中,将作为事实提交到父策略的 XML 文档作为事实传递到子策略。 您可以调用为子策略创建事实的 .NET 方法。

  7. 右键单击“ 架构”,然后单击“ 浏览”。

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

  9. 架构名称>.xsd 拖<Policy.Execute 方法的第一个参数,以将作为事实传递给父策略的 XML 文档传递给子策略。

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

  11. 单击“ .NET 类 ”选项卡。

  12. Microsoft.RuleEngine 中的 DebugTrackingInterceptor 拖到 Policy.Execute 方法的第二个参数。

    注意

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

修改调用父策略的客户端应用程序

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

DebugTrackingInterceptor dti = new DebugTrackingInterceptor("PolicyTracking.txt");  
Policy policy = new Policy("ParentPolicy");  
object[] facts = new object[3];  
facts[0] = txd;  
facts[1] = new Policy("ChildPolicy");  
facts[2] = new DebugTrackingInterceptor("PolicyTracking2.txt");  
policy.Execute(facts, dti);  
policy.Dispose();  

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

从父策略调用 .NET 包装程序方法

本部分介绍调用 .NET 方法的高级步骤,该方法包装从父策略对 Policy.Execute 方法的调用。

创建实用程序 .NET 类

创建实用程序类
  1. 创建一个 .NET 类库项目,然后向该项目添加某一类。

  2. 添加一个静态方法,该方法调用 Policy.Execute 方法以调用其名称作为参数传递的策略,如以下示例代码所示:

    public static void Execute(string policyName, TypedXmlDocument txd)  
    {  
        DebugTrackingInterceptor dti = new   DebugTrackingInterceptor("PolicyTracking.txt");  
        Policy policy = new Policy("ParentPolicy");  
        object[] facts = new object[3];  
        facts[0] = txd;  
        facts[1] = new Policy("ChildPolicy");  
        facts[2] = new DebugTrackingInterceptor("PolicyTracking2.txt");  
        policy.Execute(facts, dti);  
        policy.Dispose();  
    }   
    
  3. 确保 StaticSupport 注册表项设置为 1 或 2。 有关注册表项的详细信息,请参阅 调用类的静态成员

    注意

    您可以使用某一实例方法来代替静态方法。 请记住,如果您使用某一实例方法,则客户端必须将帮助程序 .NET 类的实例作为事实传递到父策略。

修改客户端应用程序

客户端调用父策略,并且父策略所调用的帮助程序方法将调用子策略。 该客户端的示例代码如下:

facts[0] = txd;  
facts[1] = new PolicyExecutor(txd);  
//call the first or parent policy  
Policy policy = new Policy(policyName);  
DebugTrackingInterceptor dti = new DebugTrackingInterceptor("PolicyTracking.txt");  
policy.Execute(facts, dti);  
policy.Dispose();  

注意

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

注意

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