Поделиться через


Расширение функций баз данных в Visual Studio

Вы можете возможности Visual Studio Premium или Visual Studio Ultimate путем создания расширений функций. Эти расширения функций позволяют расширить функции Visual Studio Premium или Visual Studio Ultimate, например рефакторинг, создание данных, модульное тестирование и анализ кода базы данных. Во время создания расширений функций используется существующая архитектура базовой функции, так что значительно сокращается объем кода, который необходимо написать.

Расширения функций имеют хорошо определенные точки расширения. Во время создания расширений функций для Visual Studio Premium или Visual Studio Ultimate не нужно иметь SDK для Visual Studio.

Типичные высокоуровневые задачи

Высокоуровневая задача

Справочные материалы

Сведения о расширяемости базы данных. Прежде чем расширять эти функции, необходимо понимать, как именно расширяемость поддерживается в Visual Studio Premium или Visual Studio Ultimate. Поставщик базы данных внедряет все службы, которые относятся к конкретному бренду и версии базы данных (например, SQL Server 2008). Сюда включается анализатор, который считывает и записывает скрипты базы данных; доменная объектная модель для скриптов, которая представляет скрипты; и модель схемы, которая моделирует объекты, связи и свойства объектов базы данных. В Visual Studio Premium или Visual Studio Ultimate во время взаимодействия с функцией или расширением функции эти функции и расширения функций работают с определенной комбинацией служб DSP, доменной объектной модели для скриптов и модели схемы.

  • Моделирование базы данных

  • Компоненты расширяемости в выпуске Database Edition

  • Типы расширений функций

  • Базовые компоненты поставщиков схемы баз данных

Добавление поддержки новых типов рефакторинга базы данных. Можно создать расширения функций для рефакторинга базы данных, чтобы включить новые типы рефакторинга базы данных. Каждый новый тип рефакторинга также требует одного или нескольких новых участников рефакторинга.

Добавление поддержки новых конечных объектов рефакторинга базы данных. Вы можете включить существующий тип рефакторинга базы данных, чтобы обновить новый тип объекта, например, текстовый файл, или данные вывода для стороннего приложения, содержащего сведения для базы данных. Если создается новый тип рефакторинга, вы должны внедрить одного или нескольких участников рефакторинга, чтобы включить применение этого типа для обработки объектов, содержащихся в проекте базы данных.

Определение новых правил анализа кода базы данных. Вы можете определить новые правила анализа кода базы данных, чтобы выполнить поиск ошибок, не выявляемых правилами, которые включены в состав Visual Studio Premium или Visual Studio Ultimate.

Создание пользовательских генераторов данных. Пользовательские генераторы данных можно использовать для создания реалистичных тестовых данных, которые не раскрывают конфиденциальные данные. Вы можете создавать пользовательские генераторы данных в дополнение к генераторам данных, которые включены в состав Visual Studio Premium или Visual Studio Ultimate.

Добавление пользовательских условий модульного теста базы данных. Определив пользовательское условие теста, можно проверить поведение объекта базы данных с помощью методов, которые не поддерживаются встроенными условиями модульных тестов.

Настройка поведения проекта базы данных. Определяя пользовательскую функцию проекта базы данных, можно изменить поведение проекта, если встроенные проекты базы данных не соответствуют имеющимся потребностям.

Моделирование базы данных

Чтобы смоделировать базу данных, Visual Studio моделирует как скрипты, которые составляют язык описания данных (DDL) базы данных, так и базу данных, которая создается в результате исполнения этих скриптов. Модель скриптов DDL определяется доменной объектной моделью для скриптов. Модель полученной базы данных определяется моделью схемы.

Потоки данных между компонентами расширяемости

На следующей схеме показаны потоки данных между этими компонентами.

Потоки данных между компонентами расширяемости

Потоки данных между компонентами расширяемости

Определения объектов базы данных хранятся в проекте базы данных в виде скриптов DDL. При открытии проекта базы данных эти скрипты считываются, и две модели заполняются данными: доменная объектная модель для скриптов и модель схемы. Функции Visual Studio Premium взаимодействуют с обеими моделями, и в случае сохранения изменений в объектах базы данных эти изменения сохраняются в скриптах DDL.

Компоненты расширяемости в выпуске Database Edition

На следующей схеме показаны взаимодействующие компоненты, которые позволяют расширить функции выпуска Database Edition.

Обмен данными между компонентами расширяемости

Компоненты расширяемости выпуска Database Edition

Во время открытия или создания проекта базы данных компонент диспетчера расширений загружает любых зарегистрированных поставщиков схемы базы данных. При использовании определенных функций для поставщика схемы базы данных (DSP) компонент диспетчера расширений загружает функции и их расширения, которые поддерживают этого поставщика DSP. Например, если вы используете функции переименования рефакторинга для переименования объектов в SQL Server 2008, загружается функция рефакторинга, а также типы и участники рефакторинга для SQL Server 2008.

Диспетчер расширений

При запуске Visual Studio Premium или Visual Studio Ultimate все проекты базы данных, поставщики схем, функции и расширения функций взаимодействуют с одиночным объектом ExtensionManager. Диспетчер расширений загружает единичный экземпляр, полученный из DatabaseSchemaProvider, для каждого проекта базы данных. Например, когда Visual Studio Premium или Visual Studio Ultimate открывает проект Microsoft SQL Server 2005, диспетчер расширений загружает экземпляр Sql90DatabaseSchemaProvider (который он получил из DatabaseSchemaProvider).

Диспетчер расширений загружает расширения, основанные на типе интерфейса, реализованного этими расширениями. Например, при использовании функции модульного теста базы данных диспетчер расширений возвращает список зарегистрированных расширений, которые наследует базовый класс TestCondition и чьи расширения совместимы с поставщиком схемы базы данных для проекта базы данных.

Совместимость расширений функций

Любая функция, например, рефакторинг или анализ статичного кода, состоит из компонентов, которые характерны для определенного поставщика схемы базы данных (DSP), и компонентов, которые поддерживают всех поставщиков DSP (т.е. эти компоненты не зависят от выбранного поставщика DSP). При определении расширения функции вы объявляете совместимость этого расширения с определенным поставщиком схемы базы данных или с базовым поставщиком схемы базы данных, так что это расширение загружается только для соответствующих типов проектов. Например, вы можете объявить, что расширение совместимо с поставщиком Sql90DatabaseSchemaProvider (чтобы ограничить его для проектов SQL Server 2005) или с SqlDatabaseSchemaProvider (базовый класс для поставщиков схемы базы данных SQL Server 2005 и SQL Server 2008). Вы можете также объявить, что расширение будет совместимо с несколькими определенными поставщиками схемы базы данных. Вы можете использовать этот подход, если не уверены, будет ли ваша функция работать в будущих выпусках. Чтобы объявить совместимость функции со всеми поставщиками схемы базы данных, объявите ее совместимой с базовым классом DatabaseSchemaProvider.

Примеры

Определение совместимости расширения с одним поставщиком схемы базы данных:

// SqlSchemaObjectDesigners is defined as compatible with all Sql 
// database services providers.  
[DatabaseSchemaProviderCompatibility (typeof(Sql90DatabaseSchemaProvider))]
internal class SqlSchemaObjectDesigners : ISchemaObjectDesigners
{
}

Определение совместимости расширения с несколькими поставщиками схемы базы данных:

// Extension InconclusiveCondition is defined as compatible with all 
// SQL Server database services providers and Oracle database 
// services providers.
[DatabaseSchemaProviderCompatibility (typeof(SqlDatabaseSchemaProvider))]
[DatabaseSchemaProviderCompatibility (typeof(OracleDatabaseSchemaProvider))]
public sealed class InconclusiveCondition : TestCondition
{
}

Определение совместимости расширения со всеми поставщиками схемы базы данных:

// Extension ReportingService is defined as compatible with all
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(DatabaseSchemaProvider))]
internal class ReportingService : IReportingService
{
}

Определение совместимости расширения ни с одним поставщиком схемы базы данных:

// Extension ExecutionTimeCondition is defined as compatible with no
// database services providers.  That means if a feature
// has an ExtensionManager constructed with null, it will load
// those extensions defined as binding to 
// DspCompatibilityCategory.None
[DatabaseSchemaProviderCompatibility (DspCompatibilityCategory.None)]
public sealed class ExecutionTimeCondition : TestCondition
{
}

Типы расширений функций

Вы можете создавать расширения функций, которые расширяют возможности нескольких функций Visual Studio Premium или Visual Studio Ultimate. В следующей таблице описаны типы расширений, которые можно создать.

Функция

Тип расширения

Описание

Модульное тестирование базы данных

Условия модульных тестов

Вы можете добавить пользовательские проверочные утверждения, чтобы определить успех или неудачу для тестов. Большая часть интерфейсов API модульного тестирования является открытой, но не представляет точку расширяемости. Эти API используются для создания модульных тестов базы данных, которые пишутся в управляемом коде, таком как Visual C# или Visual Basic. Дополнительные сведения см. в разделе Определение пользовательских условий для модульных тестов базы данных.

Создание данных

Генераторы данных

Вы можете обратиться к API расширяемости для создания пользовательских генераторов данных, если генераторы данных включаются в состав Visual Studio Premium или Visual Studio Ultimate. Дополнительные сведения см. в разделе Создание специализированных тестовых данных с помощью пользовательского генератора данных.

Анализ кода базы данных

Правила анализа кода.

Вы можете определить собственные правила анализа кода, чтобы проверить наличие определенных ошибок в коде базы данных. Дополнительные сведения см. в разделе Создание и регистрация дополнительных правил анализа кода кода базы данных.

Рефакторинг базы данных

Целевые объекты рефакторинга

Вы можете расширить существующие типы рефакторинга, чтобы обрабатывать новые целевые объекты, такие как новые типы файлов. Дополнительные сведения см. в разделе Пошаговое руководство. Распространение рефакторинга с переименованием для баз данных на текстовые файлы.

Рефакторинг базы данных

Типы рефакторинга

Вы можете создавать новые типы операций рефакторинга, например, замена вложенных условий на защитные предложения. Дополнительные сведения см. в разделе Создание пользовательских типов или целевых объектов рефакторинга базы данных.

Базовые компоненты поставщиков схемы баз данных

Поставщик схемы базы данных (DSP) состоит из трех групп компонентов:

  • Доменная объектная модель для скриптов — объектная модель и вспомогательные службы, которые моделируют произвольный скрипт SQL, включающий инструкции DDL и DML.

  • Модель схемы — объектная модель и вспомогательные службы, которые моделируют объекты в экземпляре базы данных, например, таблицы, представления и хранимые процедуры.

  • Службы взаимодействия с пользователем — коллекция служб, которые обеспечивают базовым компонентам доступ к ресурсам интерфейса пользователя, например, строки, которые представляют собой имена объектов, значки, которые представляют типы и категории объектов, и иерархии, в которых должны отображаться эти объекты.

Основные функции поставщика DSP — обеспечивать обработку скриптов DDL в представления доменной объектной модели для скриптов и модели схемы и работу функции обратного воспроизведения скриптов из двух представлений моделей.

Доменная объектная модель для скриптов

Доменная объектная модель для скриптов обеспечивает реализацию, которая анализирует скрипт DDL в объектную модель, представляющую скрипт. Доменная объектная модель для скриптов также обеспечивает реализацию воспроизведения исходного скрипта из модели.

На следующей схеме показаны потоки данных в доменной объектной модели для скриптов.

Потоки данных в доменной объектной модели для скриптов

Поток данных через модель DOM скрипта

Анализатор доменной объектной модели для скриптов преобразует скрипт, который хранится в неструктурированном текстовом файле, в объект, который наследует интерфейс IScriptFragment. Генератор скриптов в доменной объектной модели для скриптов берет объект, который наследует интерфейс IScriptFragment, и создает исходный скрипт. В поставщиках схемы базы данных для SQL Server, которые включаются в состав Visual Studio Premium или Visual Studio Ultimate, IScriptFragment извлекает дерево абстрактного синтаксиса (AST) и поток токенов.

Токены предоставляют неструктурированное представление скрипта. Каждый токен в коллекции имеет следующее:

  • Тип токена (например, ключевое слово или строковый литерал)

  • Строка токена

  • Исходный файл токена

  • Смещение в файле, где был выявлен токен

Деревья абстрактного синтаксиса (AST) предоставляют структурированное представление скрипта. Каждый узел синтаксиса AST представляет собой пакет инструкций, инструкцию или компонент инструкции (например, выражение). Деревья AST используются для анализа скриптов после обработки анализатором. Деревья AST можно также использовать для программного построения скриптов.

Модель схемы

Представление модели схемы — это интерфейсная модель объекта, которая моделирует интерактивный экземпляр базы данных. Интерфейсы размещаются в иерархии наследования, которая включает один абстрактный уровень, совместно используемый всеми поставщиками DSP, а также любое количество абстрактных уровней, содержащих более конкретные сведения о модели. Например, интерфейс ISql90Table наследует ISqlTable, который наследует интерфейс абстрактного уровня IDatabaseTable. Схема модели берет объекты IScriptFragment и преобразует их в элементы модели схемы, а также выполняет обратное преобразование из элементов модели схемы в объекты IScriptFragment. Модель схемы состоит из определенного количества реализаций составителя моделей. Каждая реализация создает модель из другого ресурса в системе. Например, ScriptModelComposer составляет модель из файлов скриптов, которые хранятся в проекте базы данных.

Инфраструктура модели схемы (ModelStore и вспомогательные классы) реализует интегрированные ссылки доменной объектной модели для скриптов непосредственно из элементов модели. Это обеспечивает моделирование объектов, например хранимых процедур, которые содержат произвольные скрипты.

Модель схемы состоит из коллекции элементов и заметок. Элементы описывают моделируемые объекты (например, таблицы, представления, хранимые процедуры, триггеры, столбцы и т.п.). Заметки используются для связывания произвольных данных с моделью. Они используются базовыми компонентами проекта базы данных, а также могут использоваться функциями проектов и расширениями функций. Элементам и заметкам можно присваивать имена или оставлять их анонимными.

Элементы модели

Элементы состоят из свойств и отношений. Свойства представляют базовые данные, такие как целые числа, логические значения и строки, и используются для хранения сведений о модели. Отношения представляют собой связи между элементами по именам и типам. Например, элемент ISqlTable хранит отношение типа ISqlColumn с именем "Столбцы", которое связывает таблицу с ее столбцами.

Существует три основных типа отношений.

  • Одноранговый — это произвольная зависимость одного элемента от другого элемента. В SQL Server отношение между представлением и таблицей — это типичный пример одноранговой связи.

  • Составной — это отношение, когда один элемент состоит из других элементов. В SQL Server отношение между таблицей и ее столбцами — это типичный пример составной связи. Ключевой принцип составного отношения заключается в следующем: два элемента создаются одновременно в рамках одной операции. Элементы не имеют порядка зависимостей при создании или удалении. Однако модель хранит направление зависимости родительский-дочерний, что обеспечивает поддержку ассоциативных зависимостей. Например, если столбец имеет зависимость определенного типа, зависимость родительской таблицы от входящего в его состав столбца означает, что таблица также зависит от типа.

  • Иерархический — представляет собой иерархию. Иерархические отношения отличаются от составных отношений, так как направление зависимости — дочерний-родительский (а не наоборот). Пример в SQL Server — это отношение между схемой и собственным объектом, например, таблицей или представлением. Таблица принимает участие в иерархической связи со своей схемой.

На следующей схеме показаны три различных типа отношений, которые могут быть представлены в модели схемы.

Отношения объектов в модели схемы

Связи объектов в модели схемы

Каждое отношение в модели объявляет, является ли оно единичным или множественным. В любом случае, элемент может хранить пустое отношение. Модели могут быть незавершенными моделями реального объекта.

Элементы основаны на интерфейсе, благодаря чему они поддерживают следующие функции в реализации хранилища:

  • Строгая типизация (идентификация) элементов

  • Множественное наследование

    • Поддержка компонентов системы, которые зависят и не зависят от конкретных поставщиков DSP

    • Поддержка совместного использования характеристик типов элементов, которые в другом случае были бы несвязанными

  • Гибкость и расширяемость версий

Все классы элементов моделей внедряют открытый интерфейс IModelElement. Доступ к свойствам, отношениям и заметкам можно получить с использованием API метаданных ModelStore из этого класса. Интерфейсы, такие как IDatabaseTable, обеспечивают более удобный и понятный доступ (в момент компиляции) к свойствам и отношениям.

Заметки модели

Подобно элементам, заметки состоят из свойств. В отличие от элементов, заметки не принимают участие в отношениях. Вместо этого заметки прикрепляются к элементам или к самому хранилищу моделей. Заметки строго типизируются, и один экземпляр заметки можно прикрепить к нескольким элементам, а также к хранилищу моделей. Заметки, прикрепленные к модели, представляют собой экземпляр заметки, который является "глобальным" для модели.