- PVSM.RU - https://www.pvsm.ru -
Для .net разработчиков не секрет что существует Visual Studio, а в ней есть Architecture Modeling. С помощью этого инструмента отлично получается создавать диаграммы, визуализировать мысли, можно даже код сгенерировать. Для нас было важно связать то, что было «намоделировано» с реальным миром и данными. Как вы понимаете, модель в вакууме разработчикам не очень интересна.
Мы решили немного расширить описание модели, чтобы иметь возможность из неё сгенерировать артефакты, которые можно использовать вне Modeling Project. В нашем случае это были XSD схемы, которые описывают модели (контракты методов API). Можно было и WSDL генерировать, можно Java/C# классы, но мы остановились на xsd.
Чтобы лучше понять, как это делать, на мой взгляд, лучше всего изучить, как происходит код генерация на C#. А Уже затем сделать по образу и подобию. Вооружившись поисковиком на ваш вкус, можно найти статьи на эту тему, однако я попробую пересказать просто-кратко-как сам понял.
Чтобы писать расширения для uml нужно 2 компонента:
Все типы диаграмм, которые можно строить в Visual Studio, предоставляют свои объекты через унифицированные интерфейсы.
Набор их таков:
Я думаю, что из их названий примерно понятно что это. Для диаграммы классов этот список map'ится прям один в один, а, например, для диаграммы компонентов сам компонент будет представлен как IClass, его интерфейсы — как IProperties и т.д. Смысл в том, что интерфейсы единообразны для разных типов моделей. Это хорошо, т.к. можно одинаково работать с разными типами диаграмм, но нас будут интересовать диаграммы классов.
Существует C#-profile, частный случай profile. В нем описано в виде xml, какие объекты какими метаданными на диаграмме могут быть описаны/расширены.
Пример: в UML модели Visual Studio существует диаграмма классов, в ней есть классы: их можно получить через интерфейс Microsoft.VisualStudio.Uml.Classes.IClass. В C# этому интерфейсу можно сопоставить и class, и struct. На uml диаграмме мы можем выбрать (указав C#-profile) будем ли мы считать UML_Class эквивалентным C# class или C# struct.
Сам C#-profile можно найти в папке C:Program Files (x86)Microsoft Visual Studio 11.0Common7IDEExtensionsMicrosoftArchitecture ToolsUmlProfiles
На него лучше посмотреть своими глазами — он не такой уж большой (строк 400).
Profile состоит из 3 секций:
На UML диаграмме рисуются создаются (ибо мы архитекторы, а не просто быдлокодеры) модели. Во всей диаграмме допускается использование определенного набора profiles, в частности C# profile. Затем у модели можно выбрать, какой stereotype из profile использовать. Потом можно задать к stereotype его свойства: например, у C# видимость класса (public/protected/private etc).
Разметку закончили.
К Visual Studio написано расширение (extension), которое добавляет кнопку «Generate Code».
Мы можем написать свои обработчики кнопок:
Жмем кнопку, вызывается прикладной код расширения и он уже генерирует код.
Внутри происходит следующее:
Что нам нужно чтобы схожим образом сгенерировать xsd схемы.
Пример создания profile [5], Кастомизация profile [6], Описание содержимого profile [7]
Атрибут ClassDesignerExtension — этот атрибут один из комплекта атрибутов, по которым Visual Studio определяет на каких типах диаграмм это расширение можно использовать. Другие варианты ComponentDesignerExtension и тп. Этих атрибутов можно поставить и больше, но мне было достаточно одного.
Import на свойстве DiagramContext — Он говорит Visual Studio что это свойство нужно инициализировать из MEF контейнера. Есть Dependency Injection через конструктор, а это DI через свойства.
Остальной код- тривиален: получить все элементы IClass, сгруппировать их по IPackage.Name и далее для каждого пакета- вывести в файл.
(Можно на t4 это сделать, но самый простой прототип проще получить конкатенацией строк, хотя t4, безусловно, правильнее.)
P.S. У меня не было задачи сделать полную генерацию XSD схему- задача была показать как это делается в принципе.
Автор: SychevIgor
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/54720
Ссылки в тексте:
[1] Microsoft Visual Studio 2012 SDK : http://www.microsoft.com/en-us/download/details.aspx?id=30668
[2] Microsoft Visual Studio 2012 Visualization & Modeling SDK: https://www.microsoft.com/en-us/download/details.aspx?id=30680
[3] Как написать кнопку в menu uml diagram : http://msdn.microsoft.com/en-us/library/ee329481.aspx
[4] Как написать расширение visual studio: http://msdn.microsoft.com/en-us/library/ee329484.aspx
[5] Пример создания profile: http://msdn.microsoft.com/en-us/library/dd465143.aspx
[6] Кастомизация profile: http://msdn.microsoft.com/en-us/library/dd465156.aspx
[7] Описание содержимого profile: http://msdn.microsoft.com/en-us/library/dd465146.aspx
[8] Источник: http://habrahabr.ru/post/211949/
Нажмите здесь для печати.