Création d'une activité en cours d'exécution avec DynamicActivity
DynamicActivity est une classe concrète et scellée avec un constructeur public. DynamicActivity peut servir à assembler des fonctionnalités d’activité au moment de l’exécution en utilisant un DOM d’activité.
Fonctionnalités DynamicActivity
L'objet DynamicActivity a accès aux propriétés d'exécution et aux arguments et variables, mais pas aux services d'exécution comme la planification d'activités enfants ou le suivi.
Les propriétés de niveau supérieur peuvent être définies à l'aide des objets Argument du flux de travail. En code impératif, ces arguments sont créés à l'aide de propriétés CLR sur un nouveau type. En XAML, ils sont déclarés à l’aide d’étiquettes x:Class
et x:Member
.
Les activités sont générées à l'aide de l'interface DynamicActivity avec le concepteur utilisant l'objet ICustomTypeDescriptor. Les activités créées dans le concepteur peuvent être chargées dynamiquement à l'aide de la méthode Load, comme le montre la procédure suivante.
Pour créer une activité au moment de l’exécution en utilisant du code impératif
Ouvrez Visual Studio 2010.
Sélectionnez Fichier, Nouveau, Projet. Sélectionnez Workflow 4.0 sous Visual C# dans la fenêtre Types de projets, puis sélectionnez le nœud v2010. Sélectionnez Application console de workflow séquentiel dans la fenêtre Modèles. Nommez le nouveau projet « DynamicActivitySample ».
Cliquez avec le bouton droit sur Workflow1.xaml dans le projet HelloActivity et sélectionnez Supprimer.
Ouvrez le fichier Program.cs. Ajoutez la directive suivante en début de fichier.
using System.Collections.Generic;
Remplacez le contenu de la méthode
Main
par le code ci-dessous. Ce dernier crée une activité Sequence qui contient une activité WriteLine unique et l'affecte à la propriété Implementation d'une nouvelle activité dynamique.//Define the input argument for the activity var textOut = new InArgument<string>(); //Create the activity, property, and implementation Activity dynamicWorkflow = new DynamicActivity() { Properties = { new DynamicActivityProperty { Name = "Text", Type = typeof(InArgument<String>), Value = textOut } }, Implementation = () => new Sequence() { Activities = { new WriteLine() { Text = new InArgument<string>(env => textOut.Get(env)) } } } }; //Execute the activity with a parameter dictionary WorkflowInvoker.Invoke(dynamicWorkflow, new Dictionary<string, object> { { "Text", "Hello World!" } }); Console.ReadLine();
Exécutez l'application. Une fenêtre de console contenant le texte « Hello World! » s’affiche.
Pour créer une activité au moment de l’exécution en utilisant XAML
Ouvrez Visual Studio 2010.
Sélectionnez Fichier, Nouveau, Projet. Sélectionnez Workflow 4.0 sous Visual C# dans la fenêtre Types de projets, puis sélectionnez le nœud v2010. Sélectionnez Application console de workflow dans la fenêtre Modèles. Nommez le nouveau projet « DynamicActivitySample ».
Dans le projet HelloActivity, ouvrez Workflow1.xaml. En bas du concepteur, cliquez sur l’option Arguments. Créez un argument
In
appeléTextToWrite
de typeString
.Faites glisser une activité WriteLine de la section Primitives de la boîte à outils vers l’aire du concepteur. Attribuez la valeur
TextToWrite
à la propriété Text de l’activité.Ouvrez le fichier Program.cs. Ajoutez la directive suivante en début de fichier.
using System.Activities.XamlIntegration;
Remplacez le contenu de la méthode
Main
par le code suivant.Activity act2 = ActivityXamlServices.Load(@"Workflow1.xaml"); results = WorkflowInvoker.Invoke(act2, new Dictionary<string, object> { { "TextToWrite", "HelloWorld!" } }); Console.ReadLine();
Exécutez l'application. Une fenêtre de console contenant le texte « Hello World! » s’affiche.
Cliquez avec le bouton droit sur le fichier Workflow1.xaml dans l’Explorateur de solutions et sélectionnez Voir le code. Notez que la classe d'activité est créée avec
x:Class
et que la propriété est créée avecx:Property
.