演练:使用数据库和 .NET 事实

此演练将介绍使用业务规则编辑器创建使用数据库和 .NET 事实的策略的分步说明。

必备条件

在执行演练之前,必须将 StaticSupport 注册表项的值设置为 1 或 2。 这样可以使策略调用 .NET 类的静态方法,而无需客户端来断言该类的实例。 有关详细信息,请参阅 调用类的静态成员

本演练概述

本演练包含五个过程,如下表所述。

过程标题 过程说明
创建 TestDB 数据库和 PO 表的步骤 提供有关创建 TestDB 数据库和 PO 表的分步说明。
创建 POUtility 组件的步骤 提供有关创建 POUtility 组件的分步说明。
创建 ProcessPurchaseOrderDbNet 业务策略的步骤 提供有关创建 ProcessPurchaseOrderDbNet 策略的分步说明。
使用业务规则编辑器测试 ProcessPurchaseOrderDbNet 策略 提供有关使用业务规则编辑器测试 ProcessPurchaseOrderDbNet 策略的分步说明。
使用 Policy.Execute 方法测试 ProcessPurchaseOrderDbNet 策略 提供使用 Policy.Execute 方法测试 ProcessPurchaseOrderDbNet 策略的分步说明。

创建 TestDB 数据库和 PO 表的步骤

  1. 打开 SQL Server Management Studio 。

  2. 验证服务器名称和身份验证,然后单击“ 连接”。

  3. 在左侧对象资源管理器窗口中,右键单击计算机名称,然后单击“新建查询”。

  4. 将以下 SQL 语句复制到查询窗口:

    CREATE DATABASE [TestDB]  
    GO  
    
    Use TestDB  
    CREATE TABLE [dbo].[PO]([PONumber] [nvarchar](50) NOT NULL,  
    [Quantity] [int] NOT NULL,  
    [Status] [nchar](10) NULL  
    CONSTRAINT [PK_PO] PRIMARY KEY CLUSTERED ([PONumber] ASC))   
    GO  
    
    INSERT INTO PO VALUES ('PO1', 400, NULL)  
    INSERT INTO PO VALUES ('PO2', 700, NULL)  
    GO  
    
  5. 按 F5 执行 SQL 查询。

  6. 在对象资源管理器窗口中,展开计算机名称,展开“数据库”,然后验证 TestDB 是否存在。

  7. 依次展开“TestDB”、“表”,然后验证该 dbo。PO 存在。

  8. 右键单击 “dbo”。PO,然后单击“ 打开表” 以验证表中是否存在以下数据。

    PONumber 数量 状态
    PO1 400 Null
    PO2 700 Null

创建 POUtility 组件的步骤

  1. 启动 Microsoft Visual Studio

  2. 在 Visual Studio 的“ 文件 ”菜单上,指向“ 新建”,然后单击“ 项目”。

  3. 在“新建项目” 对话框中执行以下操作:

    使用此选项 要执行此操作
    项目类型 单击“ Visual C#”。
    模板 单击“ 类库”。
    名称 键入 POUtilityLib
    位置 指定 C:\BRE-Walkthroughs 作为位置。
    解决方案名称 类型 POUtilitySol
    为解决方案创建目录 选中此复选框以便为解决方案文件创建目录。
  4. 单击 “确定”POUtilityLib 项目应出现在解决方案资源管理器中。 如果未看到解决方案资源管理器,请单击“视图”菜单上的“解决方案资源管理器”。

  5. 在属性窗口,将文件名 Class1.cs 更改为 POUtility.cs

  6. 向该类添加公共构造函数,如以下代码所示:

    public POUtility()  
    {  
    }  
    
  7. 将名为 GetMaxAllowed 的静态方法添加到 POUtility 类,如以下代码所示:

    public static int GetMaxAllowed()  
    {  
    return 500;  
    }   
    
  8. 启动 Visual Studio 命令提示符

  9. 将目录更改为 C:\BRE-Walkthroughs\POUtilitySol,然后执行以下命令:

    Sn -k POUtility.snk

  10. 在 Visual Studio 解决方案资源管理器中,展开“属性”,然后双击“AssemblyInfo.cs”。

  11. 将以下语句添加到 AssemblyInfo.cs 文件末尾:

    [assembly: AssemblyKeyFile(@"C:\BRE-Walkthroughs\POUtilitySol\POUtility.snk")]  
    
  12. 在解决方案资源管理器窗口中,右键单击“POUtilityLib”,然后单击“生成”。

  13. 在 Visual Studio 命令提示符处,将目录更改为 C:\BRE-Walkthroughs\POUtilitySol\POUtilityLib\Bin\Debug,然后执行以下命令将 POUtility 组件注册到 GAC (全局程序集缓存) 。 如果未打开命令提示符,请按照步骤 8 将其打开。

    Gacutil -i POUtilityLib.dll

创建 ProcessPurchaseOrderDbNet 业务策略的步骤

  1. 在“ 开始 ”菜单上,打开 “业务规则编辑器”。 如果已打开业务规则编辑器,请按 F5 刷新。

    注意

    在支持用户帐户控制 (UAC) 的系统上,可能需要具有管理权限才能运行该工具。 为此,请右键单击应用程序,然后选择“ 以管理员身份运行”。

  2. 在“事实资源管理器”窗口中,单击“ 数据库”。

  3. 右键单击“ 服务器”,然后单击“ 浏览”。

  4. 验证服务器和身份验证信息,然后单击“ 确定”。

  5. 展开 “TestDB”,然后展开“ PO”。

  6. 在“事实资源管理器”窗口中,单击“ .NET 类”。

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

  8. 选择“ POUtility”,然后单击“ 确定”。

  9. 展开 “类 1”。

  10. 在“策略资源管理器”窗口中,右键单击“ 策略”,然后单击“ 添加新策略”。

  11. 将策略名称从 Policy1 更改为 ProcessPurchaseOrderDbNet ,然后按 Enter。 您还可以在“属性”窗口中更改策略的名称。

  12. 右键单击“ 版本 1.0”,然后单击“添加”“ 新建”“Rule”。

  13. 将规则名称从 Rule1 更改为 ApprovalRule ,然后按 Enter。 您还可以在“属性”窗口中更改规则的名称。

  14. 在 IF 窗格中 (右侧顶部) ,右键单击“ 条件”,单击“ 谓词”,然后单击“ LessThanEqual”。

  15. 在“事实资源管理器”窗口中,单击“ 数据库”。

  16. “数量 ”节点从“事实资源管理器”窗口拖到 IF 窗格中的 argument1

  17. 在“事实资源管理器”窗口中,单击“ .NET 类”。

  18. 将“事实资源管理器”窗口中的 GetMaxAllowed 节点拖到 IF 窗格中的 argument2

  19. 在“事实资源管理器”窗口中,单击“ 数据库”。

  20. “状态” 节点从“事实资源管理器”窗口拖到业务规则编辑器右下角的“THEN”窗格。

  21. 在“THEN”窗格中,单击“输入值>”<,然后键入“已批准”。

  22. 在“事实资源管理器”窗口中,右键单击 ProcessPurchaseOrderDbNet 中的“版本 1.0”,然后单击“添加”“新建”“Rule”。

  23. 将规则名称从 Rule1 更改为 DeniedRule ,然后按 Enter。 您还可以在“属性”窗口中更改规则的名称。

  24. 在“IF”窗格中 (右侧顶部) ,右键单击“ 条件”,单击“ 谓词”,然后单击“ GreaterThan”。

  25. 在“事实资源管理器”窗口中,单击“ 数据库”。

  26. “数量 ”节点从“事实资源管理器”窗口拖到 IF 窗格中的 argument1

  27. 在“事实资源管理器”窗口中,单击“ .NET 类”。

  28. 将“事实资源管理器”窗口中的 GetMaxAllowed 节点拖到 IF 窗格中的 argument2

  29. 在“事实资源管理器”窗口中,单击“ 数据库”。

  30. “状态” 节点从“事实资源管理器”窗口拖到业务规则编辑器右下角的“THEN”窗格。

  31. 在“THEN”窗格中,单击“输入值>”<,然后键入“拒绝”。

  32. 在“策略资源管理器”窗口中,右键单击“ 版本 1.0 (未保存) ”,然后单击“ 保存”。

使用业务规则编辑器测试 ProcessPurchaseOrderDbNet 策略

  1. 在“ 开始 ”菜单上,打开 “业务规则编辑器”。 如果已打开业务规则编辑器,请按 F5 刷新。

  2. 在“策略资源管理器”窗口中,依次展开“ 策略”和“ ProcessPurchaseOrderDbNet”,右键单击“ 版本 1.0”,然后单击“ 测试策略”。

  3. 单击“ TestDB:PO (数据连接) ”,然后单击“ 添加实例”。

  4. “连接到SQL Server”对话框中,验证服务器名称和身份验证信息,然后单击“确定”。

  5. “选择绑定 ”对话框中,展开“ TestDB”,单击“ PO”,然后单击“ 确定”。

  6. 单击“测试”。

  7. 在“输出”窗口中,验证是否同时触发 了 ApprovalRuleDeniedRule

  8. 在“SQL Server Management Studio”中,右键单击“dbo”。PO,然后单击“打开表”。

  9. 验证第一条记录的 “状态” 字段的值是否设置为“ 已批准 ”。

  10. 验证第二条记录的 “状态” 字段的值是否设置为 “拒绝 ”。

    注意

    如果仍然看到 “状态” 字段的值为 NULL,请右键单击包含数据的列表,然后单击“ 执行 SQL”,这会刷新视图。

  11. 使 SQL Server Management Studio 保持打开的状态。

使用 Policy.Execute 方法测试 ProcessPurchaseOrderDbNet 策略

  1. 启动 Microsoft Visual Studio

  2. 在 Visual Studio 的“ 文件 ”菜单上,指向“ 新建”,然后单击“ 项目”。

  3. 在“新建项目” 对话框中执行以下操作:

    使用此选项 要执行此操作
    项目类型 单击“ Visual C#”。
    模板 单击“控制台应用程序”
    名称 键入 TestProcessPODbNet
    位置 指定 C:\BRE-Walkthroughs 作为位置。
    解决方案名称 键入 TestProcessPODbNetSol
    为解决方案创建目录 选中此复选框以便为解决方案文件创建目录。
  4. 单击 “确定”TestProcessPODbNet 项目应出现在解决方案资源管理器中。 如果未看到解决方案资源管理器,请单击“视图”菜单上的“解决方案资源管理器”。

  5. 在解决方案资源管理器中,右键单击“引用”,然后单击“添加引用”。

  6. 单击“ 浏览”,浏览到 “\Program Files\Common Files\Microsoft BizTalk”,然后双击 “Microsoft.RuleEngine.dll”。

  7. 将以下代码添加到 Program.cs 文件顶部的现有 using 语句后面:

    //To use the SQLConnection class  
    using System.Data.SqlClient;  
    
    //To use the Policy and DataConnection classes  
    using Microsoft.RuleEngine;  
    
  8. 将以下代码添加到 Main 函数,以创建并打开 SQLConnection 对象:

    SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=SSPI");  
    cn.Open();  
    
  9. 将以下代码添加到 Main 函数末尾,以基于在上一步中创建的 SQLConnection 对象创建 DataConnection 对象:

    DataConnection dc = new DataConnection("TestDB", "PO", cn);  
    
  10. 将以下代码添加到末尾的 Main 函数,以创建 Policy 对象并执行策略:

    Policy policy = new Policy("ProcessPurchaseOrderDbNet");  
    policy.Execute(dc);  
    
  11. 将以下代码添加到末尾的 Main 函数以更新数据库:

    dc.Update();  
    
  12. 将以下代码添加到末尾的 Main 函数,以关闭与数据库的连接:

    cn.Close();  
    
  13. 添加 try-catch 块以捕获 Main 方法中生成的任何异常。

  14. 验证 Main 函数的完整代码是否如以下代码所示:

    try  
    {  
    SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=SSPI");  
    cn.Open();  
    DataConnection dc = new DataConnection("TestDB", "PO", cn);  
    Policy policy = new Policy("ProcessPurchaseOrderDbNet");  
    policy.Execute(dc);  
    dc.Update();  
    cn.Close();  
    }  
    catch (Exception ex)  
    {  
    Console.WriteLine(ex.Message);  
    }  
    
  15. 在“ 生成 ”菜单上,单击“ 生成测试”“进程”“PODbNet”。

  16. 在“业务规则编辑器”中,展开“ 策略”,展开“ ProcessPurchaseOrderDbNet”,右键单击“ 版本 1.0”,然后单击“ 发布”。

  17. 右键单击“ 版本 1.0 - 已发布”,然后单击“ 部署”。

  18. 在SQL Server Management Studio中,将这两条 PO 记录的“状态”字段的值设置为 NULL

  19. 在 Visual Studio 中,按 CTRL+F5 执行 TestProcessPODbNet 应用程序。

  20. 按任意键关闭命令提示符窗口。

  21. 在 SQL Server Management Studio 中,右键单击包含 PO 记录的表,然后单击“执行 SQL”。

  22. 验证第一条记录的 “状态” 字段的值是否设置为“ 已批准 ”。

  23. 验证第二条记录的 “状态” 字段的值是否设置为 “拒绝 ”。

注释

  • 如果策略使用 .NET 类的非静态方法,你需要使用断言 .NET 类的实例的事实创建器组件,以便通过使用业务规则编辑器来测试该策略。

  • 请务必记住,业务规则编辑器会创建 DataConnection 对象的实例,并将其自动断言到规则引擎的工作内存中。 但是,从客户端 (BizTalk 或非 BizTalk) 应用程序调用策略时,不会自动创建 DataConnection 对象。 客户端应创建 DataConnection 对象,并将其作为参数或事实传递给规则引擎以执行策略。

  • 可以使用 DebugTrackingInterceptor 类跟踪策略执行详细信息。 以下示例代码演示如何创建 DebugTrackingInterceptor 类的实例,并在执行策略时使用它:

    DebugTrackingInterceptor dti = new DebugTrackingInterceptor("c:\\Trace.txt");  
    policy.Execute(dc, dti);  
    
  • 可以使用 SqlTransaction 类以事务方式从 ProcessPODbNet 策略更新数据库。 以下代码演示如何开始事务,将事务作为参数传递给 DataConnection 对象,并提交数据库更改。 有关详细信息,请参阅事务支持

    SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=SSPI");  
    cn.Open();  
    //Begin the transaction  
    SqlTransaction  tn = cn.BeginTransaction();  
    //Pass the transaction object to the DataConnection constructor  
    DataConnection dc = new DataConnection("TestDB", "PO", cn, tn);  
    Policy policy = new Policy("ProcessPurchaseOrderDbNet");  
    DebugTrackingInterceptor dti = new DebugTrackingInterceptor("c:\\Trace.txt");  
    policy.Execute(dc, dti);  
    dc.Update();  
    //Commit the database transaction  
    tn.Commit();  
    cn.Close();  
    

另请参阅

选择事实