I. Introduction▲
WF est livré avec quatre types d'activité, qui vont vous permettre d'emprunter des chemins différents (et donc de modifier en conséquence la sortie de votre workflow) en fonction de l'évaluation d'une condition, il s'agit des activités :
- IfElse ;
- While ;
- CAG ;
- Replicator.
II. L'activité IfElse▲
L'activité IfElse, qui par défaut va contenir 2 branches ; une branche Then et une branche Else. On pourra très facilement rajouter de nouvelle branche et donc de cette façon imbriquer les tests. Retenons cependant qu'une seule branche sera empruntée par notre chemin d'exécution, il s'agit de la 1ere branche évaluée à true.
De même, toutes les branches, à l'exception de la dernière, doivent contenir une condition, la dernière étant exécutée si toutes les autres évaluations de condition ont échoué.
Pour positionner la condition, nous avons le choix dans le concepteur entre une condition de code, et une règle
Si nous utilisons une condition de code, nous devons ensuite renseigner le nom de la méthode à appeler pour gérer l'évaluation de la condition et le résultat de l'évaluation devra être positionné sur la propriété Result comme ci-dessous.
private
void
EvaluateConditon
(
object
sender,
ConditionalEventArgs e) {
//Code d'évaluation Result à true si la conditon est vrai, sinon false.
e.
Result =
true
;
}
En ce qui concerne la méthode utilisant les règles, vous avez à votre disposition un éditeur implémentant l'IntelliSense ; il ne vous reste plus qu'à définir une propriété/un champ booléen dans votre code et de l'évaluer dans la règle.
III. L'activité While▲
L'activité While quant à elle va nous permettre d'exécuter une boucle tant qu'une condition sera vraie.
Cette activité ne peut contenir qu'une seule activité enfant ; cependant, si vous souhaitez exécuter plusieurs activités, vous pouvez toujours utiliser soit une activité Sequence et vous en servir comme conteneur, soit une activité Parallele qui vous permettra d'exécuter plusieurs tâches en parallèle.
La condition se négocie de la même façon avec une activité IfElse.
IV. L'activité CAG▲
Pour modéliser une activité CAG (Condition Activity Group), on pourrait prendre une condition While, dans laquelle on insère une activité Parallele, et dans chacune des branches de l'activité Parallele, on insère une activité IfElse.
En effet, une activité CAG va contenir une ou plusieurs activités parallèles qui pourront s'exécuter en parallèle.
Chacune de ces activités enfants pourra s'exécuter à condition que la condition « When » (d'où l'activité IfElse dans chacune des activités enfants de l'activité Parallele) positionnée à leur niveau soit évaluée à « true »
De même, l'activité CAG s'exécutera indéfiniment tant que au moins l'une de ses activités enfant aura sa condition When positionné à true, ou alors si vous positionnez explicitement la condition « Until » à true au niveau du CAG lui-même (d'où l'activité While.).
V. L'activité Replicator▲
Passons maintenant à l'activité Replicator. Cette dernière va accepter une activité enfant, se baser sur une collection IList et exécuter son activité enfant autant de fois que la collection contient d'élément, puis s'arrêter, à moins que vous ne fassiez jouer la condition Until comme avec l'activité CAG.
Prenons un exemple simple et partons du workflow ci-dessous, un Replicator contenant une activité Code.
Pour configurer notre Replicator, nous avons donc besoin d'une collection IList ; créons-la, puis initialisons-la dans le constructeur de notre classe.
public
List<
int
>
Numbers;
public
Workflow1
(
) {
InitializeComponent
(
);
Numbers =
new
List<
int
>(
);
for
(
int
i =
0
;
i <
10
;
i++
) Numbers.
Add
(
i);
}
Maintenant, il nous faut lier notre Replicator et notre List ; pour cela, il suffit de positionner la propriété InitialChildData. De même, toutes nos instances enfants peuvent être exécutées soit séquentiellement, soit en parallèle en fonction de ce que nous souhaitons réaliser, à nous de le définir en positionnant la propriété ExecutionType.
À partir de maintenant, notre workflow est fonctionnel !
Cependant, il pourrait également être intéressant de faire communiquer notre Replicator et sa CodeActivity enfant, qu'en pensez-vous ?
Pour cela, nous allons utiliser les propriétés :
- Initialized, qui s'exécute juste après l'initialisation du Replicator ;
- ChildInitialized, qui s'exécute juste après l'initialisation de l'activité enfant ;
- ChildCompleted, qui s'exécute juste après l'activité enfant ;
- Completed, qui s'exécute juste après la fin d'un loop.
Toujours avec notre exemple simpliste, nous allons par exemple récupérer la valeur de l'objet courant de notre collection depuis notre CodeActivity.
Pour cela, nous allons utiliser la propriété ChildInitialized, en lui affectant une valeur ChildInitialize
Et ensuite dans notre code, nous allons rajouter le code suivant :
int
step =
-
1
;
private
void
ChildInitialize
(
object
sender,
ReplicatorChildEventArgs e) {
step =
(
int
)e.
InstanceData;
}
private
void
ExecuteCode
(
object
sender,
EventArgs e) {
Console.
WriteLine
(
"Activité Code exécutée. Etape {0}"
,
step);
}
Voici la sortie que nous obtenons :
VI. Conclusion▲
Nous avons pu voir au travers de cet article que WF permettait de construire des scénarios riches et variés en nous fournissant diverses implémentations de nos conditions.
J'espère que cet article vous aidera à choisir celle qui correspond le plus à vos besoins.