外部 RuleSet 工具包

通常,当规则在工作流应用程序中使用时,规则是程序集的一部分。 在某些情况下,你可能希望独立于程序集维护 RuleSet,以便无需重新生成和部署工作流程序集即可更新这些规则集。 此示例允许你在数据库中管理和编辑 RuleSet,并在运行时从工作流访问这些 RuleSet。 这使正在运行的工作流实例能够自动合并 RuleSet 更改。

外部 RuleSet 工具包示例包含一个基于 Windows 窗体的工具,可用于管理和编辑数据库中的 RuleSet 版本。 它还包括用于执行这些规则的活动和主机服务。

注释

此示例需要 Microsoft SQL Server

Visual Studio 作为 Windows Workflow Foundation (WF)的一部分提供 RuleSet 编辑器。 可以通过双击 Policy 工作流中的活动来启动此编辑器;它将定义的 RuleSet 对象序列化为与工作流关联的 .rules 文件(活动 Policy 针对工作流运行 RuleSet 实例)。 在生成工作流项目时,此 .rules 文件将作为资源编译到程序集中。

此示例的组件包括:

  • 可用于编辑和管理数据库中 RuleSet 版本的 RuleSet 图形用户界面工具。

  • 一项 RuleSet 服务,该服务在主机应用程序上进行配置,并从数据库访问 RuleSet。

  • 一种ExternalPolicy活动:从RuleSet服务请求一个RuleSet,并在工作流中运行该RuleSet。

下图显示了组件的交互。 以下各节描述了每个组件。

图解展示了外部 RuleSet 工具包示例的概览。

RuleSet 工具

下图是 RuleSet 工具的屏幕截图。 从 “规则存储 ”菜单中,可以从数据库加载可用的 RuleSet,并将修改后的 RuleSet 保存回存储区。 应用程序配置文件为 RuleSet 数据库提供数据库连接字符串。 启动该工具时,它会自动从配置的数据库中加载 RuleSet。

显示 RuleSet 浏览器的屏幕截图。

RuleSet 工具将主要版本号和次要版本号应用于 RuleSets,使你可以同时维护和存储多个版本(除了版本控制功能之外,该工具不提供锁定或其他配置管理功能)。 使用该工具,可以创建新的 RuleSet 版本或删除现有版本。 单击“ 新建”时,该工具会创建新的 RuleSet 名称并应用版本 1.0。 复制版本时,该工具会创建所选 RuleSet 版本的副本,包括包含的规则,并分配新的唯一版本号。 这些版本号基于现有 RuleSet 的版本号。 可以使用窗体上的关联字段更改 RuleSet 名称和版本号。

单击 “编辑规则”时,RuleSet 编辑器将启动,如下图所示:

显示 RuleSet 编辑器的屏幕截图。

这是作为 Windows Workflow Foundation Visual Studio 外接程序一部分的编辑器对话框的重新托管。 它提供相同的功能,包括 Intellisense 支持。 根据工具中与 RuleSet 关联的目标类型(例如工作流)创作规则;单击主工具对话框中的“ 浏览 ”时,将显示 “工作流/类型选择器 ”对话框,如图 4 所示。

工作流 /类型选择

图 4:工作流/类型选择器

可以使用 “工作流/类型选择器 ”对话框指定程序集和该程序集中的特定类型。 这个类型是创作(和运行)规则所依据的目标类型。 在许多情况下,目标类型是工作流或其他一些活动类型。 但是,可以对任何 .NET 类型运行 RuleSet。

程序集文件的路径和类型名称与 name are stored with theRuleSet 一起存储在数据库中,这样当从数据库检索 RuleSet 时,此工具会尝试自动加载目标类型。

在“工作流/类型选择器”对话框中单击“确定”时,它会根据 RuleSet 验证所选类型,以确保目标类型具有规则引用的所有成员。 错误显示在 “验证错误 ”对话框中。 可以选择继续更改,尽管出现错误,也可以单击“ 取消”。 在主工具对话框中的“ 工具 ”菜单中,可以单击“ 验证 ”以针对目标活动重新验证 RuleSet 版本。

显示“验证错误”对话框的屏幕截图。

在工具的 “数据” 菜单中,可以导入和导出 RuleSet。 单击“ 导入”时,将显示一个文件选择器对话框,可从中选择 .rules 文件。 这可能不是最初在 Visual Studio 中创建的文件。 .rules 文件应包含包含条件集合和 RuleSet 集合的序列化 RuleDefinitions 实例。 该工具不使用条件集合,但它确实使用 RuleDefinitions .rules 格式来允许与 Visual Studio 环境交互。

选择 .rules 文件后,将显示 RuleSet 选择器 对话框。 可以使用对话框从要导入的文件中选择 RuleSet(默认值指定所有 RuleSet)。 .rules 文件中的 RuleSet 没有版本号,因为它们在 WF 项目中的版本与程序集的版本相同。 在导入过程中,该工具会自动分配下一个可用的主版本号(导入后可以更改):可以在 RuleSet 选择器 列表中查看分配的版本号。

对于导入的每个 RuleSet,该工具将尝试根据 RuleSet 中使用的成员,从 .rules 文件的位置下从 bin\Debug 文件夹中查找关联类型(如果存在)。 如果该工具找到多个匹配类型,它将尝试根据 .rules 文件名与类型名称之间的匹配选择类型(例如,类型 Workflow1 对应于 Workflow1.rules)。 如果存在多个匹配项,系统会提示你选择该类型。 如果此自动标识机制找不到匹配的程序集或类型,则在导入后,可以在主工具对话框中单击“ 浏览 ”以导航到关联类型。 下图显示了 RuleSet 选择器:

显示 RuleSet 选择器对话框的屏幕截图。

在主工具菜单中单击 “数据导出 ”时, “规则集选择器 ”对话框再次出现,可从中确定应导出的数据库中的 RuleSet。 单击“ 确定”时,将显示“ 保存文件 ”对话框,可在其中指定生成的 .rules 文件的名称和位置。 由于 .rules 文件不包含版本信息,因此只能选择具有给定 RuleSet 名称的一个 RuleSet 版本。

PolicyFromService 活动

活动PolicyFromService的代码非常简单。 它的工作方式与 WF 提供的活动非常类似 Policy ,但它不从 .rules 文件检索目标 RuleSet,而是调用主机服务来获取 RuleSet 实例。 然后,它会针对根工作流活动实例运行 RuleSet。

若要在工作流中使用该活动,请在工作流项目中添加对PolicyActivitiesRuleSetService程序集的引用。 有关如何将活动添加到工具箱的讨论,请参阅本主题末尾的过程。

将活动置于工作流中后,必须提供要运行的 RuleSet 的名称。 可以输入名称作为文本值,或绑定到另一活动的工作流变量或属性。 (可选)可以为应运行的特定 RuleSet 输入版本号。 如果将主要版本号和次要版本号的默认值保留为 0,则会自动为活动提供数据库中的最新版本号。

RuleSet 服务

该服务负责从数据库检索指定的 RuleSet 版本并将其返回到调用活动。 如前所述,如果在调用中 GetRuleSet 传递的主要版本值和次要版本值均为 0,则服务将检索最新版本。 此时,没有规则集定义或实例的缓存;同样,没有将 RuleSet 版本标记为“已部署”的功能,以将它们与正在进行的 RuleSet 区分开来。

应使用应用程序配置文件在主机上配置服务访问的数据库。

运行此工具

  1. 设置该工具和服务使用的 RuleSet 表的文件夹包含Setup.sql文件。 可以运行Setup.cmd批处理文件,在 SQL Express 上创建 Rules 数据库并设置 RuleSet 表。

  2. 如果编辑批处理文件或Setup.sql并指定不使用 SQL Express 或将表放在除其他名称之外的 Rules数据库中,则应使用相同的信息编辑 RuleSet 工具和 UsageSample 项目中的应用程序配置文件。

  3. 运行Setup.sql脚本后,可以生成 ExternalRuleSetToolkit 解决方案,然后从 ExternalRuleSetTool 项目启动 RuleSet 工具。

  4. RuleSetToolkitUsageSample顺序工作流控制台应用程序解决方案包括示例工作流。 此工作流由一个 PolicyFromService 活动和两个变量 orderValuediscount 组成,它是目标 RuleSet 运行时依据的工作流。

  5. 若要使用该示例,请生成 RuleSetToolkitUsageSample 解决方案。 然后,在 RuleSet 工具主菜单中,单击 “数据导入 ”并指向 RuleSetToolkitUsageSample 文件夹中的 DiscountRuleSet.rules 文件。 单击 “规则存储-保存 ”菜单选项,将导入的 RuleSet 保存到数据库。

  6. PolicyActivities由于程序集是从示例工作流项目引用的,因此PolicyFromService活动将显示在工作流中。 但是,默认情况下,它不会显示在工具箱中。 若要将其添加到工具箱,请执行以下作:

    • 右键单击工具箱并选择“ 选择项 ”(这可能需要一段时间)。

    • 出现 “选择工具箱项 ”对话框时,单击“ 活动 ”选项卡。

    • 浏览到 PolicyActivities 解决方案中的 ExternalRuleSetToolkit 程序集,然后单击“ 打开”。

    • 确保在 PolicyFromService选择工具箱项 ”对话框中选中活动,然后单击“ 确定”。

    • 活动现在应显示在 RuleSetToolkitUsageSample 组件 类别的工具箱中。

  7. RuleSet 服务已在控制台应用程序主机上使用Program.cs中的以下语句进行配置。

    workflowRuntime.AddService(new RuleSetService());
    
  8. 还可以使用配置文件在主机上配置服务;有关详细信息,请参阅 SDK 文档。

  9. 应用程序配置文件将添加到工作流项目中,以指定服务要使用的数据库的连接字符串。 这应与 RuleSet 工具使用的连接字符串相同,它指向包含 RuleSet 表的数据库。

  10. 现在可以像运行任何其他工作流控制台应用程序一样运行 RuleSetToolkitUsageSample 项目。 在 Visual Studio 中按 F5 或 Ctrl+F5 或直接运行 RuleSetToolkitUsageSample.exe 文件。

    注释

    必须关闭 RuleSet 工具才能重新编译使用示例,因为该工具加载使用情况示例程序集。