Шаблоны T4 и использование директивы include для общего кода - PullRequest
2 голосов
/ 28 ноября 2011

Я переопределил шаблоны генерации контроллера T4, как описано здесь .

Изучая шаблоны AddView (Create.tt, Delete.tt, Details.tt, Edit.tt, List.tt), я обнаружил, что в конце всех этих файлов есть много общего кода в функциональном блоке класса. Итак, я подумал, что должен быть умным и поместить весь общий код во внешний файл и просто включить этот файл во все шаблоны.

<#@ include file="common.ttinc" #>

Однако это не работает. Следующая ошибка отображается

Загрузка включаемого файла common.ttinc вернула пустую или пустую строку. Преобразование не будет выполнено.

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

Редактировать

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

Редактировать 2

Я должен добавить, что файл common.ttinc находится в том же каталоге, что и шаблоны представления, и пользовательский инструмент не определен, поскольку я хочу, чтобы шаблон обрабатывался только при доступе через мастера добавления контроллера / добавления представления

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

В настоящее время ASP.Net MVC использует пользовательский хост для T4, а не стандартный Visual Studio, и пользовательский хост не поддерживает стандартное поведение включения, поэтому включения в MVC не работают.

Iне знаю, поддерживает ли MVC базовые классы, но если это так, то это был бы другой подход.

В этом случае хорошим вариантом является регистрация ошибки соединения на http://connect.microsoft.com/VisualStudio.

1 голос
/ 28 ноября 2011
Loading the include file 'common.ttinc' returned a null or empty string. 
The transformation will not be run.

Эта ошибка означает, что движок T4 не нашел включаемый файл. Движок IIRC T4 начинается с поиска в той же папке, что и файл .tt. В VS2010 SP1 также должно быть возможно использовать $ (ProjectDir) как расширения.

Вы можете определить функциональные блоки класса в отдельном включаемом файле, я делаю это все время.

0 голосов
/ 14 марта 2017

Старый вопрос, все еще актуальный. Согласился с @FuleSnabel, но лучше, чем должен , расширения, такие как $ (ProjectDir) и $ (SolutionDir) do , работают в VS2015. Я склонен объявлять свои библиотеки общего кода tt в «общем» проекте, а для других продуктов или проектов, которым это необходимо, я создаю файл tt, включающий общий файл tt, передавая путь к файлу шаблона, чтобы я мог создать локальный файл и пространство имен, поэтому сгенерированный код относится к текущему проекту.

    <#@ template debug="false" hostspecific="true" language="C#" #>
    <#@include file="$(SolutionDir)..\..\Company\trunk\src\csharp\Company.Common.Interfaces\Generation\EnumMethods.tt" once="true"#>
    <#@ output extension=".g.cs" #><#
    GenerateEnums(this.Host.TemplateFile, "Company.Product.Interfaces");
    #>

Примечание: это работает для меня, поскольку ко всем моим продуктам / библиотекам можно обращаться по относительному пути, и у всех разработчиков в команде одинаковые относительные пути, но я столкнусь с проблемами при работе с ветками, потому что это транк папка в пути неверна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...