数据库重构扩展性概述

可以扩展数据库重构的功能以提供新类型的重构或重构新的文件类型。 可通过创建功能扩展实现数据库重构的这两种类型的扩展性。 创建数据库重构的功能扩展前,应了解数据库重构的组件如何交互以及在何处可以扩展这些组件。

若要使数据库重构可以对新目标进行操作,可通过从 RefactoringContributor 抽象基类继承来创建自定义重构参与者。 例如,可以支持重构为数据库项目中包含的文本文件或 XML 文件。

若要启用 Visual Studio 高级专业版或 Visual Studio 旗舰版未附带的重构类型,可通过从 RefactoringOperation 抽象基类继承来创建自定义重构操作。 例如,可实现一个新的重构类型,将嵌套的条件语句替换为一系列单独 IF 语句形式的安全的子句。

数据库重构和重构参与者

下图介绍数据库重构如何使用称为重构参与者的组件来处理特定类型的重构。

数据库重构扩展性概述

数据库重构扩展性概述

在 Visual Studio 的当前会话中首次应用数据库重构操作时,将加载重构功能以及所有重构类型和参与者。 您所指定的命令将传递给重构功能,并将启动指定的重构类型。 重构参与者管理器遍历为指定重构类型注册的每个参与者。 每种类型的参与者适用于不同的一个对象或一组对象,并且每种类型都可以有一个不同的数据流。

实现新类型的重构时,必须创建支持该类型重构操作所必需的参与者。 例如,可能要创建一个新的重构类型,将嵌套的条件语句替换为安全的子句。 由于该类型的重构只会更改过程体或函数体,而不会更改任何数据库对象的名称,因此只需创建架构对象参与者和脚本参与者。

架构对象参与者

下图显示处理数据库架构对象的重构参与者的数据流。

架构对象参与者的数据流

架构对象参与者的数据流

架构对象参与者可更新架构对象的定义。 参与者更新数据架构模型中的“写时复制”存储区。 更新的模型元素将传递给脚本域对象模型(脚本 DOM)生成器,并用于生成经过更新的脚本 DOM。 脚本 DOM 区别引擎将经过更新的脚本 DOM 与该对象原始定义的脚本 DOM 相比较,并生成经过更新的脚本。

引用参与者

下图显示处理对象之间引用的引用参与者的数据流。

引用参与者的数据流

引用参与者的数据流

引用参与者从数据架构模型检索所有引用及其偏移量,并更新数据架构模型的“写时复制”存储区中的引用。 经过更新的脚本 DOM 与原始的脚本 DOM 相比较,并将结果用于更新包含已更改引用的脚本。

数据生成计划和数据库单元测试参与者

下图显示数据生成计划和数据库单元测试参与者的数据流。

数据生成计划和数据库单元测试参与者的数据流

DGen 和 UnitTest 参与者的数据流

数据生成计划的参与者使用 XPathNavigator 查找和更新数据生成计划(它是一个 XML 文件)中的更改。

数据库单元测试的参与者分析数据库单元测试的 .resx 文件,并提取该文件中存储的脚本字符串。 然后,使用与数据库脚本参与者相同的数据流处理这些脚本字符串。

数据库脚本参与者

下图显示数据库脚本参与者的数据流。

数据库脚本参与者的数据流

数据库脚本参与者的数据流

数据库脚本参与者为预先部署脚本和后期部署脚本、为其他 .sql 脚本以及为从数据库单元测试提取的 SQL 脚本字符串处理更新。 模型生成器取得该脚本,并在数据架构模型的临时存储区中生成该脚本的模型。 临时存储区用于创建经过修改的脚本 DOM 模型。 经过修改的该模型与原始脚本中的模型进行比较,差别用于生成最终更新的脚本。

自定义参与者

可以创建自己的自定义参与者,以支持本主题前面没有介绍的其他重构目标。 例如,可以创建自定义参与者来更新文本文件、数据库文档或来自第三方工具的输出。 必须确定支持重构目标所需的正确数据流。 如果新目标类型类似于现有参与者的目标类型,则应引用本主题前面所述的类型。

数据库重构类型

可通过创建新的重构类型启用新类型的重构。 通过实现至少四个从以下基类继承的类,创建新的重构类型:

  • RefactoringCommand
    注册此类以提供新类型的重构。 此类指定对哪些模型元素提供命令,并在用户单击命令时调用您的重构操作。

  • RefactoringOperation
    此类指定您的重构操作与预览窗口交互的方式,指定用于描述操作的属性,并创建 ContributorInput。

  • ContributorInput
    此类将输入数据存储到 RefactoringContributor。 如果主要参与者需要辅助参与者来完成重构操作,则可能必须创建多个从 ContributorInput 派生的类。 例如,如果要更改对象的名称,则不仅必须修改对象自身,还必须修改对该对象的所有引用。 因此,可以为符号创建一个 ContributorInput,并为对符号的所有引用创建另一个。

  • RefactoringContributor
    此类根据指定的输入生成更改建议的列表。 与 ContributorInput 一样,可能必须创建多个从 RefactoringContributor 派生的类。 如果需要辅助 ContributorInput,则主要 RefactoringContributor 创建该输入。 必须声明与您的重构参与者兼容的数据库架构提供程序。 还必须为重构类型和重构命令注册所有参与者。

数据库重构目标

可以扩展重构的已注册类型以对新目标(如新类型的模型元素或新文件)进行操作。 若要使重构可以对新目标进行操作,必须创建新的重构参与者。 新的参与者必须能够对该重构类型的某个已定义 ContributorInput 进行操作。 通过实现至少一个从以下基类继承的类,创建新的重构目标或参与者:

  • RefactoringContributor
    此类根据指定的输入生成更改建议的列表。 必须声明与您的重构参与者兼容的数据库架构提供程序,并且必须注册重构类型的所有参与者。