Accueil > Microsoft .Net > Comment générer du code avec des modèles T4

Comment générer du code avec des modèles T4

Que vous soyez un développeur .net, java, C, php,… ou quelqu’un qui fait quotidiennement du SQL , des batch, du XML, etc. Il vous est sûrement arrivé de vouloir générer vos scripts ou codes car ils se ressemblent beaucoup. Pour moi personnellement, à une époque où je faisais beaucoup de Php (du CodeIgniter :-P), je me lassais d’écrire tout le temps les codes des modèles d’accès aux données, des controllers et même des vues (qui ne font tout le temps que : lister/ajouter/modifier et supprimer des enregistrements en base de données); j’avais utilisé un outil bien connu pour la génération de code, qui s’appelle CodeSmith. Et cela faisait bien l’affaire, mais le hic, c’est que c’est un outil payant 😦

Mais si vous avez déjà Visual Studio, et même si vous voulez générer d’autres scripts/codes en dehors de C# ou VB; vous pouvez bien l’utiliser pour générer des codes. Et pour ceux qui ont déjà essayé CodeSmith, cela a une certaine ressemblance ! Il s’agit des modèles T4. Voici un how-to rapide pour ceux qui veulent s’initier. En tout cas, voici comment je l’utilise :

Premièrement, comment créer un modèle T4 ?

Après avoir créé un projet (une librairie de classe ou une application console ou même une application windows…), ajouter un nouvel élément et choisir un modèle T4 prétraité. Cela nous permet d’avoir un fichier d’extension .tt avec un fichier .cs associé qui porte le même nom.

Utilisation simple des balises T4

Comme de nombreux utilitaires de génération (entre autres CodeSmith), un modèle T4 se base sur l’utilisation de balises spécifiques.

<#@      #> => pour écrire un code en en-tête comme le type de langage à utiliser par le moteur de génération (généralement c’est du C#), définir le type de code à générer (du texte ou du C# ou du SQL ou du XML, ou tout ce qu’on veut), ou importer des assembly, référencer des namespace. Habituellement, ce que l’on va trouver dans un en-tête de template T4, c’est le genre de code qui suit :

T4

Ces lignes de code signifient que : on va générer du code avec du C#, et on va générer du texte (.txt). Par défaut; le code généré est d’extension .cs. Mais ce qui est embêtant avec Visual Studio, c’est que lorsqu’on fournit une extension .cs ou .vb au code à générer, il tente de le compiler à la volée au moment où l’on lancera la génération proprement dite. C’est utile dans certains cas, mais parfois, c’est gênant car nous n’aurons pas forcément les références aux assembly que le code généré aurait besoin en exécution. En effet, le moteur de génération peut être un projet vraiment à part… Mais de toute façon, même si on génère du .txt, au moment où l’on crachera le contenu vers un fichier, nous pouvons spécifier la vraie extension, comme le nom du fichier d’ailleurs.

Ici, en plus, et c’est un exemple réel 🙂 nous faisons référence à un assembly externe : Xxx.CodesGenerator.Library ainsi qu’aux namespaces définies juste en dessous. Cet assembly nous sert – juste en passant – de requêter la structure de notre base de données. Mais tout ça reste en dehors de cet article !

Le balise <# #> permet d’ écrire du code C# pour le moteur. Ceci nous permet d’écrire du code pour personnaliser notre génération : des clauses if, des boucles, des appels à des variables externes (on verra cela plus bas), etc. C’est équivalent à <% %> pour ceux qui connaissent du ASP.Net.

<#= #> sert à écrire du code qui va cracher quelque chose en sortie. C’est comme faire un « echo » en PHP… c’est équivalent à <%= %> lorsqu’on fait du ASP.Net.

Et c’est tout !!! Tout ce que vous écrivez en dehors de ces balises sera généré en sortie. Du moins, dans mon cas, ces trois balises me suffisent pour générer quelques choses d’utilisables.

Utiliser une variable fournie par du code externe

Dans tout le code du template, on peut récupérer une variable fourni par du code externe en passant par une propriété qui s’appelle Session. Dans l’exemple ci-dessous, nous utilisons une variable de type TableSchema (qui représente pour nous un schéma d’une table en base de données – c’est une classe que nous avons créé nous-même pour modéliser le schéma de notre base, ce la n’a rien à voir avec T4). Cela nous permet de générer un modèle POCO ou un mapping à partir d’une table donnée.

use_sessiont4

Nous verrons dans ce qui suit comment le code externe fournit la variable en question…

Lancer notre générateur à partir d’une application console

Dans le cas que je montre en exemple, nous avons juste besoin d’une application console très simple pour générer les codes et les cracher dans des fichiers. Pour cela, deux points sont à remarquer :

–          Un modèle tt est associé à un fichier cs qui porte le même nom. Ce fichier cs décrit en fait un objet que l’on peut utiliser pour générer le code proprement dit. Cet objet a une propriété Session (une variable de type dictionnaire) dans laquelle nous pouvons passer n’importe quel type d’objet. Et ce sera utilisé à l’intérieur du template lorsque ce dernier va générer le code.

–          L’objet associé à notre modèle possède aussi une méthode particulière qui s’appelle TransformText() qui permet de générer le code en interprétant les balises T4 à l’intérieur. C’est comme un moteur asp.net qui interprète les balises asp.

Voici un bout de code qui après avoir parcouru les tables en bases de données, va générer pour chaque table les modèles POCOs, les mappings etc. Remarquez la façon de passer une variable vers le template, et l’appel à la méthode TransformText(). Le reste n’est que du code qui permet de créer des fichiers et des dossiers relatifs à la génération…

Publicités
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :