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.
Si on la glisse dans un workflow, on se voit demander de choisir le type à utiliser pour notre activité générique :
Et pour finir les activités tant attendues:
Simple, efficace, mais tellement peu connu