web 2.0

Création d’un designer de tables Azure partie 1

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 :

dsl

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 :

transform

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.

Tags:

Comments

Gary Velasquez United States, on 2/23/2010 8:13:49 AM Said:

Gary Velasquez

Nice blog. I obtained a lot of great material here. I've been watching this thing for awhile. It's intriguing the way it keeps changing, yet some of the core components stay the same. Have you seen much change since Google made their most recent acquisition in the field?

Comments are closed