.NET - Apresentando T4 - Text Template Transformation Toolkit


O Text Template Transformation ToolKit ou T4 para os mais íntimos é uma ferramenta da Microsoft usada para geração de código fonte através de templates de texto.

Este recurso esta disponível no Visual Studio 2010 mas já existia nativamente no Visual Studio 2008 e também pode ser usado no Visual Studio 2005 através do dowload da Domain-Specific Language Tools for Visual Studio 2005.

Um template de texto, ou modelo de texto, é uma mistura de bloco de texto e lógica de controle que pode gerar um arquivo texto, onde a lógica de controle é escrita como fragmentos de código de programação Visual C# ou Visual Basic.

Um template T4 possui sintaxe parecida com ASP .NET sendo constituída de diretivas de processamento, blocos de textos e blocos de códigos.

Para criar um template T4 no Visual Studio 2010, sem usar nenhuma ferramenta de apoio, basta criar um novo projeto. No menu File->New Project selecione Other Languages -> Visual C# e a seguir o template Console Application e informe o nome T4_AloMundo e clique em OK;

A seguir clique no menu Project -> Add New Item e selecione o template Text File e informe o nome T4_AloMundo.tt (note a extensão .tt no arquivo)

Ao clicar em Add  você vai receber uma mensagem de alerta de segurança, clique em Ok para continuar...

Obs: Marque a opção Do not show this message again pois toda vez que formos salvar ela vai aparecer.

A seguir vamos criar um template T4 mais simples possível digitando o código abaixo:

<#@ template language=“C#” #>
Alo <# Write(”Mundo !”) #>


Vemos a seguir o código digitado no arquivo T4_AloMundo.tt e a janela Solution Explorer mostrando os arquivos do projeto que criamos:

neste template temos:

1 - Uma Diretiva de processamento que fornece modelos de compilação e opções de processamento:

<#@ template language=“C#” #> => diretiva que especifica que os blocos de código do modelo são escritos na linguagem C#;

A diretiva para VB .NET seria : <#@ template language="VB" #>
2- Um Bloco de texto que será copiado para a saída no formato que esta:

Alo  => é um bloco de texto e será copiado como esta;

3- Um bloco de código que pode conter código VB ou C# para manipular blocos de textos ou gerar a saída diretamente:

<# Write(”Mundo !”) #>  =>  O método Write escreve "Mundo" para o arquivo de saída.

Abaixo esta uma imagem que eu obtive do blog do Oleg Sych para ilustrar o processo de geração e execução do template T4:

Vamos entender o que foi feito:

1- O engine T4 processa o template traduzindo as instruções de processamento, texto e bloco de código gerando a classe concreta TextTransformation, compilando tudo em um assembly .NET;

2- Em seguida o engine T4 cria uma instância da classe GeneratedTextTransformation, chama o método TransformText e salva a string retornada no arquivo de saída;

Vamos compilar o projeto para ver o resultado.

Na figura abaixo vemos o resultado da compilação. Observe que foi gerada a palavra Mundo presente na diretiva <# Write(”Mundo !”) #>

E que o arquivo T4_AloMundo.cs foi gerado logo abaixo do template o que indica que foi gerado automaticamente pelo mesmo.

Concluímos que o código fonte gerado é uma saída do template.

Se você achou muito rústico os recursos da ferramenta, ela não tem o IntelliSense nem opção de templates para criar os arquivos T4, pode turbinar o seu Visual Studio com alguns add-ins:

1 -  T4 Editor - Um editor para templates T4 com recursos de IntelliSense da Tangible Engineering . Preencha o formulário , e escolha a versão para VS 2008 ou VS 2010:

2 -  T4 ToolBox - Um conjunto de códigos prontos para templates T4 no Visual Studio. Adiciona no VS as opções do T4 na janela Add New Item;

Se você chegou até aqui deve estar se perguntando : "E daí ? Qual a utilidade prática disso ? "

Boa pergunta garoto !!!!

Podemos usar este recurso de muitas formas tais como geração de código para Stored Procedures, gerar classes para mapeamento no caso do NHibernate, etc.

Aguarde que em breve irei escrever um artigo mostrando como tirar vantagem do recurso T4.

Eu sei é apenas T4 template e Visual Studio, mas eu gosto...

Referências:


José Carlos Macoratti