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

Зачем работать с шаблонами проектов?

Каждый раз, когда мы запускаем новый проект с помощью диалогового окна Новый проект в 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 ()

Последняя версия этого метода также добавляет файлы в папки. Это отделит их от других файлов проекта. Например, репозиторий находится в папке «Репозитории /». Модель помещается в папку «Домен /», а сервис - в папку «Службы /».

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

Полный исходный код проекта можно найти здесь.

Создавайте инновации вместе с нами. Нажмите здесь, чтобы получить доступ ко всем нашим бесплатным ресурсам.
Автор: Дейан Стойнов.