Magazine Internet

[WF] IActivityTemplateFactory, la génération d’activités sans meta-programmation

Publié le 25 mai 2014 par Jeremy.jeanson

Dans mon précédent article, je décrivais une procédure plus ou moins fastidieuse pour simuler un Break. Cette manipulation peut très vite devenir rébarbative quand il faut la reproduire plisseurs fois dans un même projet. Heureusement, Workflow Foundation permet de coder des fabriques qui produisent des déclarations de workflows à partir d’un template.

Pour ceux qui ont du mal à comprendre cette dernière phrase :

Oui on part encore dans un grand délire à la mode WF (sans T au milieu, j’insiste), ou l’on va créer un code pour générer des activités en mode design et non en exécution. On n’est pas dans de la meta-programmation, mais comme souvent avec WF on a l’impression que l’on n’en est pas loin.

Pour coder une fabrique, il faut :

  • Créer une classe qui implémente IActivityTemplateFactory.
  • Coder la méthode Create qui va créer l’activité qu’il faut générer.

Si on veut reprendre mon exemple pour simuler un Break, on doit coder le Template suivant (pas forcément évident à écrire vu que l’on a une activité déléguée générique) :

/// <summary>
/// Template to include a break in ParallelForEach
/// </summary>
/// <typeparam name="T"></typeparam>
public class ParallelForEachBreak<T > : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new TryCatch
        {
            Try = new ParallelForEach<T >
            {
                Body = new ActivityAction<T >
                {
                    Argument = new DelegateInArgument<T >("item"),
                    Handler = new Sequence
                    {
                        Activities = { new Break()}
                    }
                }
            },
            Catches =
            {
                new Catch<BreackException >()
            }
        };
    }
}

Celui-ci va retourner un TryCatch contenant un ParallelForEach et son Break (on ajoute une Sequence pour faciliter la vie de l’utilisateur final), ainsi qu’un catch capturant les exceptions de type BreakException.

Si on compile le projet, la fabrique est présente dans la toolbox, comme si il s’agissait d’une activité normale.

01_TemplateFactory

Si on la glisse dans un workflow, on se voit demander de choisir le type à utiliser pour notre activité générique :

02_TemplateFactory

Et pour finir les activités tant attendues:

03_TemplateFactory

Simple, efficace, mais tellement peu connu

Clignement d'œil


Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte