演练:使用数据库和 .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。采购订单

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

    PONumber 数量 状态
    PO1 400 Null
    PO2 700 Null

创建 POUtility 组件的步骤

  1. 开始Microsoft Visual Studio

  2. 在 Visual Studio 的 "文件" 菜单上,指向 "新建",然后单击 " Project"。

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

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

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

  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"。

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

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

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

    Gacutil -i POUtilityLib.dll

创建 ProcessPurchaseOrderDbNet 业务策略的步骤

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

    注意

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

  2. 在 "事实浏览器" 窗口中,单击 " 数据库"。

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

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

  5. 展开 " TestDB",然后展开 " PO"。

  6. 在 "事实浏览器" 窗口中,单击 " .Net 类"。

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

  8. 选择 " POUtility",然后单击 "确定"

  9. 展开 Class1

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

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

  12. 右键单击 " 版本 1.0",然后单击 " AddNewRule"。

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

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

  15. 在 "事实浏览器" 窗口中,单击 " 数据库"。

  16. 将 " 数量 " 节点从 "事实浏览器" 窗口拖到 "IF" 窗格中的 argument1

  17. 在 "事实浏览器" 窗口中,单击 " .Net 类"。

  18. 将 "事实浏览器" 窗口中的 GetMaxAllowed 节点拖到 "IF" 窗格中的 " argument2 "。

  19. 在 "事实浏览器" 窗口中,单击 " 数据库"。

  20. 将 "状态" 节点从 "事实浏览器" 窗口拖到业务规则编辑器右下方的 "THEN" 窗格中。

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

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

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

  24. 在"IF" (顶部) ,右键单击"条件",单击"谓词",然后单击"GreaterThan"

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

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

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

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

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

  30. 将"状态"节点从"事实资源管理器"窗口拖到"业务规则"窗口右下角的"THEN"Composer。

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

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

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

  1. 在"开始"菜单上,打开"Composer"。 如果已打开业务规则编辑器,请按 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,在"文件"菜单上,指向"新建",然后单击"Project"

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

    使用此选项 要执行此操作
    Project类型 单击 "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 = 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. 在"生成 "菜单 上,单击" 生成 TestProcessPODbNet"

  16. 在"Composer"中,展开"策略",展开"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 类的实例的事实创建器组件,以便通过使用业务规则编辑器来测试该策略。

  • 请记住,"业务规则"Composer 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();  
    

另请参阅

选择事实