Общие сведения о расширяемости для рефакторинга базы данных
Для того чтобы добавить новые типы рефакторинга или рефакторинг новых типов файлов, можно расширить возможности рефакторинга базы данных. Для реализации обоих типов расширяемости рефакторинга базы данных необходимо создать расширения функций. Прежде чем приступить к созданию расширений функций, необходимо получить представление о том, как взаимодействуют между собой компоненты рефакторинга базы данных, и где эти компоненты можно расширить.
Чтобы добавить операцию рефакторинга базы данных для новых конечных или целевых объектов, необходимо создать специализированные участники рефакторинга путем наследования от абстрактного базового класса RefactoringContributor. Например, можно реализовать рефакторинг текстовых файлов или XML-файлов, содержащихся в проекте базы данных.
Чтобы добавить новые типы рефакторинга, отсутствующие в Visual Studio Premium или Visual Studio Ultimate, можно создать пользовательские операции рефакторинга путем наследования от абстрактного базового класса RefactoringOperation. Например, можно создать новый тип рефакторинга, предназначенный для замены вложенных условий на защитные предложения в последовательности отдельных операторов IF.
Рефакторинг базы данных и участники рефакторинга
На следующем рисунке показано, как рефакторинг базы данных задействует компоненты, называемые также участниками рефакторинга, для обработки специальных типов рефакторинга.
Общие сведения о расширяемости рефакторинга базы данных
Если операция рефакторинга базы данных выполняется впервые в текущем сеансе Visual Studio, функция рефакторинга загружается вместе со всеми типами и участниками рефакторинга. Указанные команды передаются функции рефакторинга, и затем выполняется запуск указанного типа рефакторинга. Диспетчер участников рефакторинга проходит в цикле по всем участникам, проверяя, зарегистрирован ли участник для указанного типа рефакторинга. Каждый тип участника применяется к различным объектам или наборам объектов. Кроме того, различные типы участников используют разные потоки данных.
При реализации нового типа рефакторинга необходимо создать участники, которые требуются для поддержки операции рефакторинга этого типа. Например, можно создать новый тип операции рефакторинга, предназначенный для замены вложенных условий на защитные клаузы. Поскольку этот тип рефакторинга будет изменять только тела процедур и функций, но не будет изменять имена объектов базы данных, необходимо создать только участник объекта схемы и участник скриптов.
Участники, обрабатывающие объекты схемы
На следующей схеме изображен поток данных для участника рефакторинга, который обрабатывает объекты схемы базы данных.
Поток данных для участника, обрабатывающего объекты схемы
Участник этого типа обновляет определения объектов схемы. Участник обновляет данные хранилища с копированием при записи в модели схемы данных. Обновленный элемент модели передается построителю доменной объектной модели для скриптов (Script DOM) и используется для создания обновленной доменной объектной модели для скриптов. Обновленная доменная объектная модель для скриптов сравнивается с доменной объектной моделью для скриптов исходного определения объекта с помощью разностного модуля сравнения, и затем создается обновленный скрипт.
Участники, обрабатывающие ссылки
На следующей схеме изображен поток данных для участника, который обрабатывает ссылки между объектами.
Потоки данных для участника, который обрабатывает ссылки
Участник этого типа извлекает все ссылки и их смещения из модели схемы данных и обновляет ссылки в хранилище с копированием при записи модели схемы данных. Обновленная доменная объектная модель для скриптов сравнивается с исходной доменной объектной моделью для скриптов. Полученные результаты используются для обновления скриптов, содержащих измененные ссылки.
Участники, обрабатывающие планы создания данных и модульные тесты базы данных
На следующей схеме показан поток данных для участников, обрабатывающих планы создания данных и модульные тесты базы данных.
Поток данных для участников, обрабатывающих планы создания данных и модульные тесты базы данных
Чтобы найти и обновить изменения в плане создания данных (который представляет собой XML-файл), соответствующий участник использует XPathNavigator.
Участник модульных тестов базы данных анализирует RESX-файл модульного теста базы данных и извлекает строки скрипта, которые содержатся в этом файле. Затем строки скрипта обрабатываются с использованием потока данных, который также используется для участника скрипта базы данных.
Участники, обрабатывающие скрипты базы данных
На следующей схеме показан поток данных для участника, обрабатывающего скрипты базы данных.
Поток данных для участника, обрабатывающего скрипты базы данных
Участник данного типа обрабатывает обновления для скриптов, выполняемых перед развертыванием, и скриптов, выполняемых после развертывания, а также для других SQL-скриптов и для строк SQL-скриптов, извлеченных из модульных тестов базы данных. Построитель модели создает модель на основе скрипта во временном хранилище модели схемы данных. Временное хранилище используется для создания измененной доменной объектной модели для скриптов. Эта измененная модель сравнивается с моделью, полученной из исходного скрипта, и полученные различия используются для создания окончательного скрипта.
Специализированные участники
Для поддержки дополнительных целевых объектов рефакторинга, которые не описаны в данном разделе, можно создать собственные специализированные участники рефакторинга. Например, можно создать специализированный участник для обновления текстовых файлов, документации базы данных или выходных данных сторонних средств. При создании специализированных участников рефакторинга необходимо задать правильный поток данных, который требуется для поддержки целевого объекта рефакторинга. Если новые типы объектов рефакторинга имеют сходство с целевыми типами существующих участников, необходимо создать ссылки на типы, описанные ранее в настоящем разделе.
Типы рефакторинга базы данных
Для расширения существующих типов рефакторинга можно создавать новые типы рефакторинга. При создании новых типов рефакторинга используется по меньшей мере четыре класса, производных от следующих базовых классов:
RefactoringCommand
Чтобы создать новый тип рефакторинга, необходимо зарегистрировать этот класс. Этот класс указывает, для каких элементов модели должна быть доступна команда. Также данный класс отвечает за вызов операции рефакторинга, когда пользователь выбирает соответствующую команду.RefactoringOperation
Этот класс указывает, как операция рефакторинга взаимодействует с окном просмотра, указывает свойства, которые описывают операцию, и создает объект ContributorInput.ContributorInput
Этот класс предназначен для хранения данных, вводимых в RefactoringContributor. Если для завершения операции рефакторинга основному участнику требуются дополнительные участники, необходимо создать несколько классов, производных от класса ContributorInput. Например, при изменении имени объекта изменяется не только сам объект, но и все ссылки на этот объект. Следовательно, необходимо создать один объект ContributorInput для символа и другой для всех ссылок на символ.RefactoringContributor
Этот класс выполняет построение списка предлагаемых изменений на основании предоставленных входных данных. Как и в случае с классом ContributorInput, можно создать несколько классов, производных от класса RefactoringContributor. Если требуется дополнительный объект ContributorInput, он будет создан основным участником RefactoringContributor. Необходимо объявить поставщики схемы базы данных, с которыми совместимы участники рефакторинга. Кроме того, необходимо зарегистрировать все участники, связав их с типом рефакторинга и командой рефакторинга.
Целевые объекты рефакторинга базы данных
Чтобы выполнять операцию рефакторинга на нестандартных объектах, например на новом типе элемента модели или новом файле, необходимо расширить зарегистрированные типы рефакторинга. Чтобы реализовать рефакторинг на новых целевых объектах, необходимы новые участники рефакторинга. Новый участник должен иметь возможность работать с одним из объектов ContributorInput, определенных для данного типа рефакторинга. При создании новых целевых объектов или участников рефакторинга используется по меньшей мере один класс, производный от следующего базового класса:
- RefactoringContributor
Этот класс выполняет построение списка предлагаемых изменений на основании предоставленных входных данных. Необходимо объявить поставщики схемы базы данных, с которыми совместимы участники рефакторинга, и зарегистрировать все участники для данного типа рефакторинга.