Добавление пользовательской проверки архитектуры в схемы слоев
В Visual Studio Ultimate и Visual Studio Premium пользователи могут проверять исходный код в проекте Visual Studio по модели слоев, чтобы убедиться, то исходный код соответствует зависимостям на схеме слоев.Не существует алгоритма стандартной проверки, но можно определить собственные расширения проверки для Visual Studio Ultimate и Visual Studio Premium.
Когда пользователь выбирает команду Проверить архитектуру на схеме слоев, вызывается стандартный метод проверки, за которым следуют установленные расширения проверки.
Примечание |
---|
Проверка на схеме слоев выполняется иначе, чем на UML-схемах.При работе со схемой слоев основной целью является сравнение схемы с программным кодом в других частях решения. |
Расширение проверки слоев можно упаковать в формат Visual Studio Integration Extension (VSIX) и предоставить его другим пользователям Visual Studio Ultimate.Можно поместить в файл VSIX один проверяющий элемент управления или добавить в файл и другие расширения.Код проверяющего элемента управления необходимо создавать в отдельном проекте Visual Studio, а не в проекте, содержащем другие расширения.
Внимание |
---|
После создания проекта проверки, скопируйте пример кода в конце этого раздела и затем изменяйте это значение в собственный. |
Требования
Visual Studio Ultimate
Пакет Visual Studio SDK
Visual Studio пакета SDK визуализации и моделирования
Определение проверяющего элемента управления слоя в новом файле VSIX
Использование шаблона проекта — самый быстрый способ создания проверяющего элемента управления.В этом случае код и VSIX-манифест размещаются в одном и том же проекте.
Определения расширения с использованием шаблона проекта
Создайте проект в новом решении, воспользовавшись командой Создать проект в меню Файл.
В диалоговом окне Создать проект в разделе Проекты моделирования выберите Расширение проверки конструктора слоев.
Шаблон создает проект, который содержит небольшой пример.
Внимание Создать шаблон правильно:
Вызовы правки в LogValidationError, чтобы удалить необязательные аргументы errorSourceNodes и errorTargetNodes.
При использовании пользовательских свойств, примените обновление упомянутое в Добавление пользовательских свойств в схемы слоев.Кроме того, решение обозревателя архитектуры перед ее открытии решения.
Отредактируйте код, чтобы определить проверку.Дополнительные сведения см. в разделе Программная проверка.
Сведения о тестировании расширения см. в разделе Отладка проверки слоев.
Примечание Этот метод вызывается только в особых обстоятельствах, точки останова не срабатывают автоматически.Дополнительные сведения см. в разделе Отладка проверки слоев.
Чтобы установить расширение в основном экземпляре Visual Studio или на другом компьютере, найдите файл .vsix в папке bin\*.Скопируйте его на компьютер, на котором его требуется установить, а затем дважды щелкните файл.Чтобы удалить его, выберите Диспетчер расширений в меню Сервис.
Добавление проверяющего элемента управления слоя в отдельный файл VSIX
Если требуется создать один VSIX-файл, который содержит проверяющие элементы слоев, команды и другие расширения, рекомендуется создать один проект для определения VSIX-файла и отдельный проект для обработчиков.Сведения о других типах расширения моделирования см. в разделе Расширение моделей и схем UML.
Добавление проверки слоев в отдельный файл VSIX
Создайте проект библиотеки классов в новом или имеющемся решении Visual Studio Ultimate.В диалоговом окне Создать проект последовательно щелкните элементы Visual C# и Библиотека классов.Этот проект содержит класс проверки слоев.
Определите или создайте в решении проект VSIX.Проект VSIX содержит файл с именем source.extension.vsixmanifest.Если необходимо добавить проект VSIX, выполните следующие действия:
В диалоговом окне Создать проект выберите Visual C#, Расширение среды, Проект VSIX.
В Обозреватель решений выберите в контекстном меню проекта VSIX, Назначить запускаемым проектом.
В source.extension.vsixmanifest, на вкладке Активы добавьте проект проверки слоев как компонент MEF.
Выберите Создать.
В диалоговом окне Добавить новый актив задайте:
Тип = Microsoft.VisualStudio.MefComponent
Источник = Проект в текущем решении
Проект = проект проверяющего элемента управления
Также необходимо добавить его в качестве проверки слоев:
Выберите Создать.
В диалоговом окне Добавить новый актив задайте:
Тип = Microsoft.VisualStudio.ArchitectureTools.Layer.Validator.Это не является одним из параметров в раскрывающемся списке.Необходимо ввести его с помощью клавиатуры.
Источник = Проект в текущем решении
Проект = проект проверяющего элемента управления
Вернитесь в проект проверки слоев и добавьте следующие ссылки на проект:
Ссылки
Возможности
Microsoft.VisualStudio.GraphModel.dll
Чтение графа архитектуры
Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema.dll
Чтение кода DOM, связанного со слоями
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll
Чтение модели слоев
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Чтение и обновление фигур и схем
System.ComponentModel.Composition
Определение компонента проверки с использованием Managed Extensibility Framework (MEF)
Microsoft.VisualStudio.Modeling.Sdk.11.0
Определение расширений моделирования
Скопируйте пример кода в конце этого раздела в файл класса в проекте библиотеки проверяющего элемента управления необходимо включить код для своей проверки.Дополнительные сведения см. в разделе Программная проверка.
Сведения о тестировании расширения см. в разделе Отладка проверки слоев.
Примечание Этот метод вызывается только в особых обстоятельствах, точки останова не срабатывают автоматически.Дополнительные сведения см. в разделе Отладка проверки слоев.
Чтобы установить VSIX в главном экземпляре Visual Studio или на другом компьютере, найдите файл .vsix в каталоге bin проекта VSIX.Скопируйте его на компьютер, на котором требуется установить VSIX.Дважды щелкните файл VSIX в проводнике Windows.(Обозреватель файлов в Windows 8).
Чтобы удалить его, выберите Диспетчер расширений в меню Сервис.
Программная проверка
Чтобы определить расширение проверки слоя, необходимо определить класс со следующими характеристиками:
Необходимо использовать следующую общую форму объявления:
using System.ComponentModel.Composition; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer; using Microsoft.VisualStudio.GraphModel; ... [Export(typeof(IValidateArchitectureExtension))] public partial class Validator1Extension : IValidateArchitectureExtension { public void ValidateArchitecture(Graph graph) { GraphSchema schema = graph.DocumentSchema; ... } }
При обнаружении ошибки сообщить о ней можно с использованием LogValidationError().
Внимание Не используйте дополнительные параметры LogValidationError.
Когда пользователь вызывает команду меню Проверить архитектуру, система среды выполнения слоев анализирует слои и их артефакты для создания графа.Граф состоит из 4 частей:
Модели слоев решения Visual Studio, представленные на графе в виде узлов и связей.
Код, элементы проекта и другие артефакты, определенные в решении и представленные в виде узлов, а также связи, представляющие зависимости, которые были обнаружены в процессе анализа.
Связи между узлами слоя и узлами артефактов кода.
Узлы, представляющие ошибки, которые были обнаружены проверяющим элементом управления.
По завершении создания графа вызывается стандартный метод проверки.После этого все установленные методы проверки расширения вызываются в произвольном порядке.Граф передается каждому методу ValidateArchitecture, который может сканировать граф и сообщать о любых обнаруженных ошибках.
Примечание |
---|
При работе с UML-схемами и доменными языками используется другой процесс проверки. |
Методы проверки не должны менять проверяемую модель слоев или код.
Модель графа определена в узле Microsoft.VisualStudio.GraphModel.Основными классами этого узла являются GraphNode и GraphLink.
Каждый узел и каждая связь имеют одну или несколько категорий, задающих тип элемента или отношения, которое этот узел или связь представляет.Узлы типичного графа имеют следующие категории:
Dsl.LayerModel
Dsl.Layer
Dsl.Reference
CodeSchema_Type
CodeSchema_Namespace
CodeSchema_Type
CodeSchema_Method
CodeSchema_Field
CodeSchema_Property
Связи от слоев к элементам в коде имеют категорию "Представляет".
Отладка проверки
Чтобы выполнить отладку расширения проверки слоев, нажмите сочетание клавиш CTRL+F5.Откроется экспериментальный экземпляр Visual Studio.Откройте или создайте модель слоев в этом экземпляре.Эта модель должна быть связана с кодом и должна иметь хотя бы одну зависимость.
Тестирование решения, содержащего зависимости
Проверка выполняется только при наличии следующих характеристик:
В схеме слоев присутствует хотя бы одна связь зависимости.
В модели имеются слои, связанные с элементами кода.
При первом запуске экспериментального экземпляра Visual Studio для тестирования расширения проверки откройте или создайте решение с указанными характеристиками.
Выполнение очистки решения перед проверкой архитектуры
Всякий раз при обновлении кода проверки необходимо использовать команду Очистить решение в меню Построение экспериментального решения. Только после этого можно тестировать команду "Проверка".Это необходимо потому, что результаты проверки кэшируются.Если тестовая схема слоев или ее код не обновлялись, методы проверки не будут выполнены.
Явный запуск отладчика
Проверка выполняется отдельным процессом.Следовательно, точки останова используемого метода проверки не будут активированы.Необходимо явно прикрепить отладчик к процессу после запуска проверки.
Чтобы прикрепить отладчик к процессу проверки, вставьте вызов метода System.Diagnostics.Debugger.Launch() в начало метода проверки.Когда отобразится диалоговое окно отладки, выберите основной экземпляр Visual Studio.
Кроме того, можно вставить вызов метода System.Windows.Forms.MessageBox.Show().Если появляется окно сообщения, перейдите к основному экземпляру Visual Studio и в меню Отладка щелкните Присоединение к процессу. Выберите процесс, который называется Graphcmd.exe.
Всегда запускайте экспериментальный экземпляр, нажимая сочетание клавиш CTRL+F5 (Запуск без отладки).
Развертывание расширения проверки
Чтобы установить расширение проверки на компьютере, на котором установлена система Visual Studio Ultimate или Visual Studio Premium, откройте VSIX-файл на конечном компьютере.Чтобы установить расширение на компьютере, на котором установлено построение Team Foundation Build, необходимо вручную извлечь содержимое файла VSIX в папку "Расширения".Дополнительные сведения см. в разделе Развертывание расширения моделирования слоев.
Пример кода
using System;
using System.ComponentModel.Composition;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.CodeSchema;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.GraphModel;
namespace Validator3
{
[Export(typeof(IValidateArchitectureExtension))]
public partial class Validator3Extension : IValidateArchitectureExtension
{
/// <summary>
/// Validate the architecture
/// </summary>
/// <param name="graph">The graph</param>
public void ValidateArchitecture(Graph graph)
{
if (graph == null) throw new ArgumentNullException("graph");
// Uncomment the line below to debug this extension during validation
// System.Windows.Forms.MessageBox.Show("Attach 2 to GraphCmd.exe with process id " + System.Diagnostics.Process.GetCurrentProcess().Id);
// Get all layers on the diagram
foreach (GraphNode layer in graph.Nodes.GetByCategory("Dsl.Layer"))
{
System.Threading.Thread.Sleep(100);
// Get the required regex property from the layer node
string regexPattern = "^[a-zA-Z]+$"; //layer[customPropertyCategory] as string;
if (!string.IsNullOrEmpty(regexPattern))
{
Regex regEx = new Regex(regexPattern);
// Get all referenced types in this layer including those from nested layers so each
// type is validated against all containing layer constraints.
foreach (GraphNode containedType in layer.FindDescendants().Where(node => node.HasCategory("CodeSchema_Type")))
{
// Check the type name against the required regex
CodeGraphNodeIdBuilder builder = new CodeGraphNodeIdBuilder(containedType.Id, graph);
string typeName = builder.Type.Name;
if (!regEx.IsMatch(typeName))
{
// Log an error
string message = string.Format(CultureInfo.CurrentCulture, Resources.InvalidTypeNameMessage, typeName);
this.LogValidationError(graph, typeName + "TypeNameError", message, GraphErrorLevel.Error, layer);
}
}
}
}
}
}
}