Depuis que j’ai commencé à m’intéresser à Azure, je me dis qu’un « designer » pour générer le code nécessaire pour les tables Azure ce serait bien pratique. Donc après avoir gouté au ciel Azure cet été je me suis mis à l’œuvre.
Les outils pour faire des outils
Commençons par faire le tri dans les divers outils qui existent : DSL Tools, T4, Oslo
Si vous ne savez pas ce qu’est un DSL je vous recommande cet excellent article qui vous définira ce qu’est un DSL et ses relations vis à vis de l’UML
- Les DSL Tools sont inclus dans le Sdk de Visual Studio 2008 et permettent de faire des DSL « visuels »
- Oslo c’est le nom de code pour la nouvelle plateforme de modélisation de Microsoft. Et Oslo va beaucoup plus loin dans le développement guidé par les modèles. Ce sera un véritable atelier de fabrication DSL en permettant de créer son langage plus seulement visuel mais textuel. Oslo n’en est qu’a ses prémisses avec une CTP j’ai donc choisi d’utiliser les DSL Tools pour faire mon “designer” mais dans un futur post je l’aborderais plus en détail.
- Les T4 ou Text Template Transformation Toolkit, fonctionnalité de Visual Studio assez méconnu mais pourtant bien pratique permettent de générer du code .
Les DSL Tools
Première étape : Installer le Sdk de Visual Studio 2008
Ensuite j’ai suivi un tutorial du MSDN pour créer mon premier DSL http://msdn.microsoft.com/fr-fr/library/bb126593.aspx puis celui la http://msdn.microsoft.com/fr-fr/library/bb126547.aspx
Si vous êtes familier avec l’UML utiliser les DSL Tools ne devraient pas vous poser de problème.
Revenons à la création de mon “designer” je vais créer un projet DSL à partir d’un projet “Minimal Language” et en choisissant comme extension pour les fichier de mon DSL .aztable .
Mon DSL va être assez simple. J’ai le “Storage” qui est la racine de mon modèle. Plusieurs tables peuvent être dans mon “Storage” Dans mes tables j’ai des “Property” dont certaines sont la PartitionKey ou la RowKey. Enfin Je veux pouvoir avoir des relations entre les tables , et pour identifier la table mère et la table enfant dans ces relations je vais rajouter une notion de “foreign key” dans mon modèle.
Voila le résultat :

Dans la partie de gauche on peut voir le modèle que j’ai énoncé plus haut. Et sur la droite ce sont les éléments graphiques du diagramme que les utilisateurs de mon DSL pourront utiliser. C’est la que l’on peut mettre les éléments de décoration du diagramme, et c’est la que l’on indique que dans le diagramme les propriétés apparaissent graphiquement dans la table.
Je peux aussi rajouter des règles de validation à mon modèle. Un tutorial est disponible sur le MSDN http://msdn.microsoft.com/fr-fr/library/bb126592.aspx
Je vais tester que le nom de la table est valide en créant une partial class Table avec le code suivant.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.Modeling.Validation;
using System.Text.RegularExpressions;
namespace ZeCloud.AzTablesGen
{
[ValidationState(ValidationState.Enabled)]
partial class Table
{
[ValidationMethod
( // These values select which events cause the method to be invoked.
ValidationCategories.Open |
ValidationCategories.Save |
ValidationCategories.Menu
)
]
private void ValidateNameTable(ValidationContext context)
{
Regex rx = new Regex("^[A-Za-z][A-Za-z0-9]*");
if (!rx.IsMatch(this.Name))
{
context.LogError(
// Description
"ce nom n'est pas valide pour une table",
// Unique code for this error
"ERR001WrongTableNameError",
// Objects to select when user double-clicks error
this);
}
}
}
}
Après avoir réalisé cela il ne faut surtout pas oublier de cliquer sur ”transform all templates” dans le solution explorer :
Et enfin je peux lancer le “debug “ de mon DSL, en faisant cela un nouveau Visual Studio démarre. En fait ce Visual Studio est un Visual Studio Experimental avec une configuration séparée de mon Visual Studio habituel. Il permet de tester son DSL sans le déployer sur la machine et sans risque de se retrouver avec un Visual Studio en rade.
Vous pouvez à présent essayer ce nouveau DSL en ajoutant un nouvel élément à la solution, vous verrez dans les templates de fichier le nom du DSL.
Dans le prochain épisode j’expliquerais comment générer du code C# depuis les éléments de mon DSL avec les T4.