Partager via


Créer des processeurs de directive de modèle de texte T4 personnalisés

Le processus de transformation du modèle de texte prend un fichier de modèle de texte comme entrée et produit un fichier texte en tant que sortie. Le moteur de transformation de modèle de texte contrôle le processus et le moteur interagit avec un hôte de transformation de modèle de texte et un ou plusieurs processeurs de directive de modèle de texte pour terminer le processus. Pour plus d’informations, consultez le processus de transformation de modèle de texte.

Pour créer un processeur de directive personnalisé, vous créez une classe qui hérite de l’une ou de l’autre DirectiveProcessorRequiresProvidesDirectiveProcessor.

La différence entre ces deux éléments est que DirectiveProcessor implémente l'interface minimale nécessaire pour recevoir les paramètres de l'utilisateur et pour générer le code qui produit le fichier de sortie du modèle. RequiresProvidesDirectiveProcessor implémente le modèle de conception requis/fournit. RequiresProvidesDirectiveProcessor gère deux paramètres spéciaux et requiresprovides. Par exemple, un processeur de directive personnalisé peut accepter un nom de fichier de l’utilisateur, ouvrir et lire le fichier, puis stocker le texte du fichier dans une variable nommée fileText. Une sous-classe de la RequiresProvidesDirectiveProcessor classe peut prendre un nom de fichier de l’utilisateur comme valeur du requires paramètre et le nom de la variable dans laquelle stocker le texte comme valeur du provides paramètre. Ce processeur ouvre et lit le fichier, puis stocke le texte du fichier dans la variable spécifiée.

Avant d’appeler un processeur de directive personnalisé à partir d’un modèle de texte dans Visual Studio, vous devez l’inscrire.

Pour plus d’informations sur l’ajout de la clé de Registre, consultez Déploiement d’un processeur de directive personnalisé.

Directives personnalisées

Une directive personnalisée ressemble à ceci :

<#@ MyDirective Processor="MyDirectiveProcessor" parameter1="value1" ... #>

Vous pouvez utiliser un processeur de directive personnalisé lorsque vous souhaitez accéder à des données ou ressources externes à partir d’un modèle de texte.

Différents modèles de texte peuvent partager les fonctionnalités qu’un processeur de directive unique fournit, de sorte que les processeurs de directive offrent un moyen de factoriser le code pour la réutilisation. La directive intégrée include est similaire, car vous pouvez l’utiliser pour factoriser le code et le partager entre différents modèles de texte. La différence est que toutes les fonctionnalités que la include directive fournit sont fixes et n’acceptent pas les paramètres. Si vous souhaitez fournir des fonctionnalités courantes à un modèle de texte et autoriser le modèle à passer des paramètres, vous devez créer un processeur de directive personnalisé.

Voici quelques exemples de processeurs de directive personnalisés :

  • Processeur de directive pour retourner des données d’une base de données qui accepte un nom d’utilisateur et un mot de passe en tant que paramètres.

  • Processeur de directive pour ouvrir et lire un fichier qui accepte le nom du fichier en tant que paramètre.

Parties principales d’un processeur de directive personnalisé

Pour développer un processeur de directive, vous devez créer une classe qui hérite de l’une ou de l’autre DirectiveProcessorRequiresProvidesDirectiveProcessor.

Les méthodes les plus importantes DirectiveProcessor que vous devez implémenter sont les suivantes.

  • bool IsDirectiveSupported(string directiveName) - Retournez true si votre processeur de directive peut traiter la directive nommée.

  • void ProcessDirective (string directiveName, IDictionary<string, string> arguments) - Le moteur de modèle appelle cette méthode pour chaque occurrence d’une directive dans le modèle. Votre processeur doit enregistrer les résultats.

Une fois que tous les appels à ProcessDirective() le moteur de création de modèles appellera ces méthodes :

  • string[] GetReferencesForProcessingRun() - Retourne les noms des assemblies requises par le code du template.

  • string[] GetImportsForProcessingRun() - Retourne les espaces de noms qui peuvent être utilisés dans le code du modèle.

  • string GetClassCodeForProcessingRun() - Retourne le code des méthodes, des propriétés et d’autres déclarations que le code du modèle peut utiliser. La méthode la plus simple consiste à générer une chaîne contenant le code C# ou Visual Basic. Pour que votre processeur de directive puisse être appelé à partir d’un modèle qui utilise n’importe quel langage CLR, vous pouvez construire les instructions en tant qu’arborescence CodeDom, puis retourner le résultat de la sérialisation de l’arborescence dans le langage utilisé par le modèle.

  • Pour plus d’informations, consultez Procédure pas à pas : création d’un processeur de directive personnalisé.