Наличие некоторых ситуаций с шаблонами T4 - PullRequest
0 голосов
/ 21 сентября 2011

Я пытаюсь создать шаблон T4 для пользовательского контроллера (со службами).Однако у меня возникли некоторые проблемы с настройкой.В настоящее время я использую ощутимый бесплатный редактор инструментов T4 и TextTemplatingFileGenerator в качестве пользовательского инструмента.При экспериментировании я сталкиваюсь с несколькими проблемами:

1: я пытаюсь использовать MvcTextTemplateHost mvcHost = (MvcTextTemplateHost) (Host);и он говорит: «Тип или имя пространства имен MvcTextTemplateHost не может быть найден (вам не хватает директивы using или ссылки на сборку?). Он говорит, что нужно очистить инструмент Custom, но мне было интересно, как я могу просмотреть сгенерированный файл T4, если яочистить инструмент?

2: Другим подходом был CustomTemplate Стива Сандерсона, но у меня возникли проблемы с тем, что DynamicTransform не был найден, и мне было интересно, где я могу получить файл, необходимый для его использования. Если мне нужно очиститьинструмент для этого, то, как я могу просмотреть сгенерированный образец файла? Большое спасибо.

Макс Гилман

Пример кода:

<#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #>
<#@ Output Extension="cs" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace someNamespace
{ 

<#  
    var modelType = (CodeType)Model.ModelType; 
    var modelName = modelType.Name; 
    var modelNamePlural = Model.ModelTypePluralized; 
    var modelVariable = modelName.ToLower(); 
    var relatedEntities = ((IEnumerable)Model.RelatedEntities).OfType<RelatedEntityInfo>();
    var primaryKeyProperty = modelType.VisibleMembers().OfType<CodeProperty>().Single(x => x.Name == Model.PrimaryKey); 
    var routingName = Regex.Replace(Model.ControllerName, "Controller$", "", RegexOptions.IgnoreCase);
    var isObjectContext = ((CodeType)Model.DbContextType).IsAssignableTo<System.Data.Objects.ObjectContext>();
#>
    public class foo
    {
        //This is a basic comment.
    }
}

1 Ответ

2 голосов
/ 23 сентября 2011

В обоих случаях похоже, что вы пытаетесь использовать шаблон T4 в своем проекте Visual Studio и использовать TextTemplatingFileGenerator в качестве пользовательского инструмента для генерации кода из шаблона.

1: MvcTextTemplatingHost являетсяпользовательский хост T4, который доступен только при использовании диалоговых окон добавления представления ASP.NET MVC или добавления контроллера.Он не будет доступен и не будет должным образом инициализирован при использовании пользовательского инструмента TextTemplatingFileGenerator.

2: MvcScaffolding / T4Scaffolding Стива Сандерсона использует собственный настраиваемый хост T4, поэтому у вас возникает похожая проблема.Если вы используете консоль диспетчера пакетов NuGet с вашим пользовательским шаблоном скаффолдинга T4, то он должен работать, но он не будет работать с пользовательским инструментом TextTemplatingFileGenerator.Сам класс DynamicTransform не существует.Если вы посмотрите на исходный код T4Scaffolding в CodePlex в классе InvokeScaffoldTemplateCmdlet, вы увидите, что директива Inherits = "DynamicTransform" фактически удалена и заменена ссылкой на объект динамической модели.Когда вы строите контроллер, на пользовательском хосте и объекте динамической модели настраиваются различные свойства (например, Model.ModelType) перед его передачей в шаблон T4 для обработки.

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

Я думаю, что ваши варианты:

  1. Создайте настраиваемый шаблон ASP.NET MVC T4 и используйте инструмент ASP.NET для создания настраиваемого контроллера с помощью диалогового окна «Добавить контроллер».
  2. Создайте настраиваемый шаблон T4 для строительных лесов и используйте диспетчер пакетов NuGetконсоль для генерации вашего пользовательского контроллера.
  3. Создайте свой собственный инструмент, который инициализирует пользовательский хост, который можно использовать из вашего шаблона T4.

Вариант 2), вероятно, ваш лучший выбор, посколькуЯ считаю, что MvcScaffolding может обновить существующий код контроллера, не удаляя тон существующий код.

...