При управлении разработкой многие организации испытывают трудности с управлением и ищут инструменты для улучшения процессов, чтобы повысить ценность. Шаблоны проектов позволяют избежать догадок при управлении процессом разработки, повышая согласованность и сокращая время доставки. Они полезны, когда вы хотите создать множество различных многопроектных решений с одинаковой файловой структурой или стандартизировать проекты в вашей организации.
Зачем работать с шаблонами проектов?
Каждый раз, когда мы запускаем новый проект с помощью диалогового окна Новый проект в Visual Studio, файлы, созданные на основе шаблона проекта, сразу становятся видимыми. Шаблон элемента - это небольшой фрагмент кода, который создается при разработке новых классов или интерфейсов. Эти шаблоны полезны, если вы хотите создавать файлы в любых проектах с одинаковой структурой кода.
Инструменты улучшения процессов в Visual Studio
Использование сторонних шаблонов или их создание
В Visual Studio много онлайн-шаблонов в галерее Расширения и обновления, но одну из самых больших коллекций шаблонов можно найти в проекте SideWaffle Template Pack. Проект на 100% поддерживается сообществом, и шаблоны доступны практически для всего - от веб-заданий Azure до AngularJ. Вы можете создать свой собственный шаблон SideWaffle и загрузить его в проект. После утверждения он будет доступен в следующей версии расширения для использования другими пользователями.
Создание шаблона проекта или элемента из существующего кода
Если у вас есть решение или файл «ролевой модели», можно создать шаблон из этого существующего кода.
Используйте «Файл / шаблон экспорта…»
В мастере вы можете выбрать один файл (для шаблона элемента) или проект (ы). Экспортированный шаблон находится в: {user} \ Documents \ Visual Studio {version} \ My Exported Templates \ {templateName} .zip.
Настроить существующие шаблоны, используемые в Visual Studio
Есть возможность обновить все шаблоны, уже созданные в Visual Studio. Если вы хотите изменить код нового класса по умолчанию или контроллер API по умолчанию, найдите свой шаблон здесь: \ Program Files (x86) \ Microsoft Visual Studio {версия} \ Common7 \ IDE \ ItemTemplates \.
После сохранения обновленного файла шаблона очистите кеш шаблона, чтобы изменения были доступны при следующем запуске Visual Studio. Просто откройте окно командной строки от имени администратора и выполните: devenv / installvstemplates.
Создание проекта или шаблона элемента с нуля
Откройте Visual Studio и в меню «Новый проект» выберите: \ Visual C # \ Extensibility.
Файлы в проекте как для элемента, так и для шаблона проекта похожи. Существуют файлы шаблонов, из которых будет сгенерирован выходной файл, и файл * .vstemplate, в котором установлены все данные для шаблона (имя, описание, значок, категория и т. Д.)
Компоненты в шаблонных проектах
Понимание XML-файла * .vstemplate
Этот файл содержит два обязательных тега:
Тег TemplateData содержит имя, описание, значок, категорию, тип проекта и другие метаданные о вашем шаблоне. Например, если ваш шаблон создан для Visual Basic, то тег ProjectType будет выглядеть так:
для C #.
Тег TemplateContent содержит все файлы, которые будут созданы при создании нового проекта или элемента.
Работа с базовым файлом шаблона
Обратите внимание на то, что эти файлы содержат много токенов со знаками доллара вокруг них. Токены будут заменены фактическими значениями во время генерации файла. Например, $ safeitemrootname $ будет заменено именем, указанным пользователем в диалоговом окне Добавить новый элемент, при этом все небезопасные символы и пробелы будут удалены. Список со всеми параметрами можно найти здесь. Вы можете определить свои собственные параметры и использовать их в файле, но мы расскажем об этом позже.
Инструменты улучшения процессов в действии: демонстрационное руководство
Недавно наша команда (6 разработчиков) запустила новый проект. (Назовем это Проектом X). Наша группа возглавила создание решения с 6 связками сборок:
- ProjectX.Web - веб-сайт администрирования MVC.
- ProjectX.API - проект REST WebAPI, который предоставляет данные на веб-сайт MVC.
- ProjectX.Core - проект содержит перечисления, помощники, расширения и интерфейсы для классов данных и бизнес-уровня.
- ProjectX.Models - здесь мы храним все модели домена и бизнес-модели.
- ProjectX.Data - здесь находятся реализации классов DAL.
- ProjectX.Business - здесь находятся реализации классов BLL.
Архитектура выглядит так:
Распространенные проблемы построения команды
Каждому члену команды нужно было разработать модуль, и обычно один модуль управляет 1-2 объектами предметной области. У каждого домена есть репозиторий и классы обслуживания. Мы используем паттерн IoC (Inversion of Control). Это означает, что каждый репозиторий и сервис реализует интерфейс. Для каждого предметного объекта разработчику требовалось создать 5 классов. Поскольку наша команда состоит из 6 человек, это привело к следующим проблемам:
- Частые конфликты слияния в файлах * .proj
- В сервисах или репозиториях одни и те же методы назывались по-разному. Например: Add () vs Insert () vs Create ()
- Если требовалось 3 объекта домена, разработчики создавали 15 классов в 15 файлах, распределенных по 4 проектам. Эта утомительная работа может привести к множеству ошибок копирования и вставки, главным образом в документации этих классов.
Инструменты улучшения процесса: шаги по созданию шаблона элемента
Создание шаблона элемента может помочь командам избежать конфликтов слияния, проблем с именованием и утомительных ошибок копирования / вставки. Мы демонстрируем код, используемый на каждом этапе, чтобы:
- Определите несколько файлов шаблонов в одном проекте шаблона элемента
- Внедрить настраиваемую логику во время создания файлов и распределить их по разным проектам.
- Оберните все в пакет VSIX, чтобы все члены команды могли легко его использовать
Создайте и определите свои классы шаблонов
Начните новый проект, выберите шаблон C # Item и назовите его ModelEx. После этого удалите по умолчанию Class.cs и добавьте новый класс DomainModel.cs:
Теперь, когда у нас есть базовый объект домена, мы должны создать классы для Сервиса и для Репозитория. Добавьте еще четыре файла классов и назовите их IModelService, ModelService, IModelRepository и ModelRepository. Чтобы эти файлы шаблонов были сгенерированы, нам необходимо зарегистрировать их в нашем файле ModelEx.vstemplate. Это сделано со следующим изменением:
Атрибут TargetFileName предназначен для фактического имени файла после выполнения шаблона. В нашем случае, если пользователь установил «Сотрудник», сгенерированные файлы будут иметь следующие имена: Employee.cs, IEmployeeRepository.cs, IEmployeeService.cs , EmployeeRepository.cs и EmployeeService.cs.
Чтобы продолжить, нам нужно использовать обходной путь, потому что использование токена $ safeitemname $ в нескольких файлах шаблонов может стать проблемой. (Прочитайте здесь для дополнительной информации). Затем мы добавим специальный параметр в файл vstemplate. Это сохранит правильное значение ввода пользователя. Добавьте следующий код сразу после последнего тега:
Вот как мы определяем настраиваемый параметр в шаблонах элементов / проектов.
Определить файлы шаблонов
IModelRepository: по названию можно догадаться, что это файл шаблона для интерфейса репозитория. Добавьте в этот файл следующий код:
ModelRepository: реализация IModelRepository
IModelService: интерфейс нашего класса обслуживания.
ModelService: реализация IModelService.
Теперь, когда мы завершили наши файлы шаблонов, мы готовы развернуть, использовать и поделиться нашим шаблоном элемента. Обозреватель решений должен выглядеть так:
Развертывание настраиваемого проекта или шаблона элемента с помощью проекта VSIX
Теперь, когда мы создали шаблон элемента, давайте посмотрим, как его развернуть. Добавьте новый проект в решение ModelEx. Выберите «Extensibility / VSIX Project» и назовите его ModelExDeploy. Весь проект представляет собой единый файл source.extension.vsixmanifest. Он предоставляет метаданные для настраиваемого шаблона, который мы хотим развернуть.
- Используйте конструктор, чтобы заполнить все необходимые данные, которые вы хотите. Прямо сейчас нам просто нужно добавить наш шаблон в качестве ресурса в пакет VSIX.
- Перейдите на вкладку Assets, нажмите кнопку New и выберите Microsoft.VisualStudio.ItemTemplate в поле Type.
- Выберите проект в текущем решении для Source и выберите проект шаблона ModelEx в поле Project.
- Щелкните ОК и закройте конструктор.
- Установите проект ModelExDeploy как запускаемый и нажмите F5.
- Новый тестовый экземпляр VS запустится там, где ваш шаблон установлен и готов к использованию.
- Откройте или создайте решение и из контекстного меню. Выберите Добавить / новый элемент… Здесь вы найдете наш готовый к использованию шаблон. Выберите имя. Когда создание будет завершено, вы увидите, что все пять файлов готовы к использованию.
Конечно, когда дело доходит до реальных проектов, каждый файл из этих пяти находится в отдельной папке или даже в другом проекте в решении. Интерфейс IWizard необходимо использовать в процессе создания шаблона.
Использование интерфейса IWizard
Добавьте настраиваемую логику и пользовательский интерфейс для настройки шаблона
Из документации визуальной студии:
«Методы интерфейса IWizard вызываются в разное время в процессе создания шаблона, начиная с того момента, когда пользователь нажимает кнопку« ОК »в диалоговом окне« Новый элемент ». Каждый метод интерфейса назван так, чтобы описать точку, в которой он вызывается. Например, Visual Studio вызывает RunStarted немедленно, когда начинает создавать элемент, что делает его удобным местом для написания собственного кода для сбора данных, вводимых пользователем ».
Давайте создадим в нашем решении новый проект библиотеки классов и назовем его ModelExWizard. Чтобы использовать интерфейс IWizard, нам нужно добавить ссылки:
- EnvDTE
- EnvDTE80
- Microsoft.VisualStudio.TemplateWizardInterface
- Microsoft.VisualStudio.Shell.14.0
- System.Windows.Forms
Затем мы должны создать новый класс, реализующий интерфейс IWizard:
А пока мы продолжим и свяжем мастер с нашим шаблоном. Во-первых, мы должны зарегистрировать нашу сборку мастера в GAC, и по этой причине важно запускать VS от имени администратора.
Перейдите в свойства проекта и подпишите сборку:
Добавьте следующий код в раздел событий после сборки
«C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ gacutil.exe» / if «$ (TargetPath)»
«C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe» -T «$ (TargetPath)»
Пути могут отличаться в зависимости от вашей системы.
Теперь вы можете собрать проект. Если все правильно, в окне вывода будет показано следующее:
После получения общедоступного токена перейдите в файл ModelEx.vstemplate и добавьте следующий тег:
Задайте для атрибута PublicKeyToken значение токена, созданное в окне вывода сборки проекта ModelExWizard.
Наконец, зарегистрируйте сборку ModelExWizard как актив в файле source.extension.vsixmanifest и включите символы отладки для отладки нашего кода.
Чтобы включить отладку, введите команду F4 при выбранном проекте ModelExDeploy и измените следующие параметры на true:
- IncludeAssemblyInVSIXContainer
- IncludeDebugSymbolsInVSIXContainer
- IncludeDebugSymbolsInLocalVSIXDeployment
Добавьте сборку как актив с помощью конструктора source.extension.vsixmanifest. Перейдите на вкладку Assets и нажмите кнопку New, выберите:
- Тип: Microsoft.VisualStudio.Assembly
- Источник: проект в текущем решении.
- Проект: ModelExWizard
Добавьте код в свой класс реализации IWizard
Теперь мы готовы добавить реальный код в наш класс реализации IWizard.
Мы создадим элемент управления в форме окна, в котором пользователю будет предложено выбрать проект из решения для каждого отдельного файла. Конечный результат будет выглядеть так:
Все проекты отправляются в раскрывающиеся списки через конструктор формы, а все проекты выбираются через VS SDK. Наш метод RunStarted будет выглядеть так:
После закрытия формы мы можем получить выбранные имена проектов, выбранные пользователем, и установить некоторые настраиваемые параметры шаблона, которые мы будем использовать позже для создания правильных пространств имен и использования в наших файлах шаблонов.
Изменение шаблона ModelServices
Мы можем использовать параметры, которые мы установили выше, во всех файлах шаблонов. Вот как изменился шаблон ModelServices.cs с пользовательскими параметрами:
Наконец, мы должны переместить уже созданные файлы в проекты, выбранные пользователем. По умолчанию шаблоны создаются, когда пользователь щелкает правой кнопкой мыши контекстное меню в обозревателе решений и выбирает параметр Добавить новый элемент…. Мы этого не хотим. Вместо этого мы реализуем
ProjectItemFinishedGenerating (ProjectItem projectItem).
Этот метод вызывается для каждого из наших файлов шаблонов. Объект projectItem - это фактически созданный объект, который находится в проекте решения VS. Сначала мы определим, какой шаблон использует projectItem, проверив свойство Name этого объекта. Затем мы проведем поиск по всем нашим проектам в решении, чтобы найти тот, который выбрал пользователь. Когда мы находим проект, мы снова используем VS SDK для копирования содержимого объекта projectItem в проект.
project.ProjectItems.AddFromFileCopy (projectItem.FileNames [0]);
Поскольку это операция копирования, обязательно удалите исходный файл из решения.
projectItem.Delete ()
Последняя версия этого метода также добавляет файлы в папки. Это отделит их от других файлов проекта. Например, репозиторий находится в папке «Репозитории /». Модель помещается в папку «Домен /», а сервис - в папку «Службы /».
С помощью нескольких щелчков мышью разработчик может создать полнофункциональный домен, репозиторий и классы обслуживания.
Полный исходный код проекта можно найти здесь.
Создавайте инновации вместе с нами. Нажмите здесь, чтобы получить доступ ко всем нашим бесплатным ресурсам.
Автор: Дейан Стойнов.