-->

среда, 19 августа 2015 г.

Шаблоны Т4 - генерация любого текста (кода) в Visual Studio

На днях возникла потребность автоматизировать одну рутинную, регулярную задачу в рабочем проекте, суть которой сводится к генерации новых классов по уже имеющимся и написании методов-оберток для имеющихся методов по одному и тому же шаблону. Первый подход, который пришел в голову - это генерация кода посредством Т4-шаблонов в Visual Studio.  Пригодность подхода оценивалась по следующему тестовому заданию:
Имеется пространство имен (без вложенных подпространств), в котором находится ряд классов (и, возможно, других типов). На основе набора публичных свойств каждого класса, необходимо сгенерировать соответствующие классы-DTO. Типы свойств могут быть как встроенными типами CLR, так и классами из этого же пространства имен.
Грубо говоря, генерируем DTO по каждому заданному классу. С помощью Reflection с последующим выводом на консоль, задача решается за чашку чая. Перенести готовый код в *.tt файл тоже нетрудно - в данном случае, достаточно заменить вызовы Console на соответствующие вызовы класса GeneratedTextTransformation (о нем чуть ниже), а также прописать в *.tt файле все используемые сборки и пространства имен.


Получаем независимый от остальной части нашего приложения шаблон, выполняющий наше задание:


При выполнении Т4-шаблона, код будет сгенерирован не напрямую, как можно было подумать. Шаблон используется Студией для неявного создания класса GeneratedTextTransformation, который и займется делом:


Пусть этот пример очень простой, но сделать несколько выводов удалось:

1. Не стреляйте из пушки по воробьям. Если задача разовая, либо редко выполняемая и шаблону суждено остаться где-то глубоко в недрах вашего корпоративного ПО - использование Т4 не несет никакой дополнительной выгоды. Код, содержащийся в шаблоне, будет прекрасно работать и без Т4 - в тестовом методе, отдельной утилите и т.п.

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

3. Сложность нарастает. Минусы также очевидны - усложняются чтение, отладка и поддержка, не говоря уже о дополнительных усилиях по переносу логики в шаблон.

4. Слабый инструментарий. Внутри шаблона не работает привычная поддержка IntelliSence и ReSharper. В составе VS "из коробки" нет даже подсветки синтаксиса для *.tt файлов, приходится ставить дополнительные расширения. Кстати, я потестил несколько и остановился на Tangible. Бесплатной версии хватает с головой, но пришлось подкорректировать палитру под темную тему Студии.

На текущем проекте точечно используется Т4, при этом задача повторного развертывания в принципе не стоит. Логика по-максимуму вынесена из *.tt файла в вспомогательные классы. В целом, писать и поддерживать код шаблонов - то еще удовольствие, и я бы рекомендовал использовать эту технологию только в случае железобетонной необходимости.

Полезные ссылки, куда без них:

Text Template Transformation Toolkit (T4): генератор кода в Visual Studio -  вводная статья на Хабре;
Oleg Sych Blog - кладезь информации по T4;
T4 (Text Template Transformation Toolkit) Code Generation - Best Kept Visual Studio Secret - подборка материалов от Scott Hanselman.

1 комментарий:

  1. The Top 10 Casino Sites for 2021 - No deposit required
    A 바카라사이트쿠폰 free bonus is a casino 포커 규칙 type bonus for players to claim for free, so if you're looking for some 강친닷컴 sort of free 넥스트바카라 bonus, then the first thing 사다리사이트 you need to do is choose

    ОтветитьУдалить