2014-10-30 1 views
0

У меня есть модель DSL и несколько шаблонов T4, которые генерируют код, соответствующий модели. Я хочу, чтобы ВСЕ шаблоны выполнялись после сохранения модели. Каждый шаблон создает несколько выходных файлов. Я знаю теоретически, как создать настраиваемый инструмент для модели, которая будет обрабатывать шаблон и возвращать сгенерированный код. Но как я могу обработать несколько шаблонов, так как интерфейс IVsSingleFileGenerator возвращает один сгенерированный файл.Обработка нескольких шаблонов T4 с помощью настраиваемого инструмента

Один из способов, я думаю, состоит в том, чтобы создать «мастер» T4, который использует общедоступные методы из шаблонов, которые должны быть обработаны. Но тогда я должен писать уродливые методы в каждом шаблоне с сотнями вызовов «Write()», потому что внутри «< # +» невозможно написать обычный текст, как в остальной части шаблона. Или я могу создать один огромный шаблон, содержащий код для ВСЕХ файлов, которые будут сгенерированы. Думаю, это уродливо и очень запутанно.

Или есть способ каким-то образом создать шаблон T4 и позволить ему обрабатывать и создавать файлы самостоятельно? Я знаю только, как создать экземпляр шаблона, чтобы его можно было обработать, но я получаю только сгенерированный код, который я должен обрабатывать самостоятельно.

ответ

0

Так как я использую MultipleOutputHelper у меня управление создаваемыми файлами. Это очень упрощает обработку нескольких шаблонов в генераторе кода:

public class MyCodeGenerator : TemplatedCodeGenerator 
{ 
    protected override byte[] GenerateCode(string inputFileName, string inputFileContent) 
    { 
     ProcessTemplate(inputFileName, CodeGenerationResource.TemplateX); 
     ProcessTemplate(inputFileName, CodeGenerationResource.TemplateY); 

     // since we're using the MultipleOutputHelper class in the t4 templates, which generates the required files on its own, we don't have to return any bytes 
     return new byte[0]; 
    } 

    private void ProcessTemplate(string inputFileName, string templateContent) 
    { 
     var fi = new FileInfo(inputFileName); 
     templateContent = templateContent.Replace("Sample.mmd", fi.Name); 
     base.GenerateCode(inputFileName, templateContent); 
    } 
} 
0

Я не знал, как генерировать текст из функции класса (< # +), но это описано в MSDN:

Generate text from a class feature

<#+ 
private void CreateAccessor(ModelClass classType, ModelClass associatedClass, string  fromRoleName, string toRoleName) 
{ 
      if(!string.IsNullOrEmpty(toRoleName) && !string.IsNullOrEmpty(fromRoleName)) 
      { 
       string validClassName = MakeValidName(associatedClass.Name); 
       string validFromName = MakeValidName(fromRoleName); 
       string validToName = MakeValidName(toRoleName); 
#> 

private <#= validClassName#> <#= validFromName#>Value; 
public <#= validClassName#> <#= validFromName#> 
{ 
    get{ return <#= validFromName #>Value; } 
    set 
    { 
     if (<#= validFromName#> != value) 
     { 
if (<#= validFromName#> != null) 
<#= validFromName#>.<#=validToName#> = null; 
<#= validFromName#>Value = value; 
if (value != null) 
{ 
     <#= validFromName#>Value.<#=validToName#>=this; 
} 
    } 
     } 
    } 
<#+ 
      } 
      else 
      { 
       Warning(String.Format("Ignoring BidirectionalAssociation from {0} to {1} because its SourceRoleName or TargetRoleName is not defined", classType.Name, associatedClass.Name)); 
      } 
} 
#> 

 Смежные вопросы

  • Нет связанных вопросов^_^