Partager via


Création avec DynamicActivity

Cette rubrique s'applique à Windows Workflow Foundation 4.

Cet exemple montre deux façons différentes de créer une activité au moment de l'exécution à l'aide de l'activité DynamicActivity.

Dans cet exemple, une activité est créée au moment de l'exécution avec un corps qui contient une activité Sequence qui contient les activités ForEach et Assign. Une liste d'entrée d'entiers est passée dans l'activité et définie comme une propriété. L'activité ForEach itère ensuite au sein de la liste de valeurs et l'accumule. Dans l'activité Assign, la valeur moyenne est calculée en divisant l'accumulateur par le nombre d'éléments dans la liste et en l'affectant à la moyenne.

L'exemple illustre l'utilisation d'une activité DynamicActivity qui transfère des variables comme arguments d'entrée et retourne des valeurs comme arguments de sortie. L'activité a un argument d'entrée nommé Numbers qui est une liste d'entiers. L'activité ForEach itère au sein de la liste de valeurs et l'accumule. Dans l'activité Assign, la valeur moyenne est calculée en divisant l'accumulateur par le nombre d'éléments dans la liste et en l'affectant à la moyenne. La moyenne est retournée comme un argument de sortie nommé Average.

Lorsque l'activité dynamique est créée par programmation, l'entrée et la sortie sont déclarées comme indiqué dans l'exemple de code suivant.

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
};

L'exemple de code suivant affiche la définition complète du DynamicActivity qui calcule la moyenne des valeurs dans une liste.

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
    Implementation = () =>
        new Sequence
        {
            Variables = { result, accumulator },
            Activities =
            {
                new ForEach<int>
                {
                    Values =  new ArgumentValue<IEnumerable<int>> { ArgumentName = "Numbers" },                                
                    Body = new ActivityAction<int>
                    {
                        Argument = iterationVariable,
                        Handler = new Assign<int>
                        {
                            To = accumulator,
                            Value = new InArgument<int>(env => iterationVariable.Get(env) +  accumulator.Get(env))
                        }
                    }
                },

                // Calculate the average and assign to the output argument.
                new Assign<double>
                {
                    To = new ArgumentReference<double> { ArgumentName = "Average" },
                    Value = new InArgument<double>(env => accumulator.Get(env) / numbers.Get(env).Count<int>())
                },
            }
        }
};

En cas de création en XAML, l'entrée et la sortie sont déclarées comme indiqué dans l'exemple suivant.

<Activity x:Class="Microsoft.Samples.DynamicActivityCreation.FindAverage"
          xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities"
          xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
          xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="Numbers" Type="InArgument(scg:List(x:Int32))" />
    <x:Property Name="Average" Type="OutArgument(x:Double)" />
  </x:Members>
    ...
    ...
</Activity>

Les données XAML peuvent être créées visuellement à l'aide du Windows Workflow Designer. S'il s'agit d'un projet Visual Studio, veillez à affecter à « Action de génération » la valeur « Aucune » pour empêcher la compilation. Les données XAML peuvent ensuite être chargées dynamiquement à l'aide de l'appel suivant.

Activity act2 = ActivityXamlServices.Load(@"FindAverage.xaml");

L'instance DynamicActivity créée par programmation ou par le biais du chargement d'un workflow XAML peut être utilisée comme indiqué dans l'exemple de code suivant. Notez que l'« acte » passé au WorkflowInvoker.Invoke est l'« acte » Activity défini dans le premier exemple de code.

IDictionary<string, object> results = WorkflowInvoker.Invoke(act, new Dictionary<string, object> { { "Numbers", numbers } });

Console.WriteLine("The average calculated using the code activity is = " + results["Average"]);

Pour utiliser cet exemple

  1. À l'aide de Visual Studio 2010, ouvrez le fichier solution DynamicActivityCreation.sln.

  2. Pour générer la solution, appuyez sur F6.

  3. Pour exécuter la solution, appuyez sur CTRL+F5.

Arguments de ligne de commande

Cet exemple accepte des arguments de ligne de commande. Les utilisateurs peuvent fournir une liste de nombres pour l'activité afin de calculer leur moyenne. La liste de nombres à utiliser est passée comme une liste de nombres séparés par un espace. Par exemple, pour calculer la moyenne de 5, 10 et 32, appelez l'exemple à l'aide de la ligne de commande suivante.

DynamicActivityCreation 5 10 32
Dd807392.Important(fr-fr,VS.100).gif Remarque :
Les exemples peuvent déjà être installés sur votre ordinateur. Recherchez le répertoire (par défaut) suivant avant de continuer.

<LecteurInstall>:\WF_WCF_Samples

Si ce répertoire n'existe pas, rendez-vous sur la page (éventuellement en anglais) des exemples Windows Communication Foundation (WCF) et Windows Workflow Foundation (WF) pour .NET Framework 4 pour télécharger tous les exemples Windows Communication Foundation (WCF) et WF. Cet exemple se trouve dans le répertoire suivant.

<LecteurInstall>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation