Partager via


Inspection d'arborescence d'activité

Cette rubrique s'applique à Windows Workflow Foundation 4.

Les auteurs de l'application de workflow utilisent l'inspection de l'arborescence d'activité pour inspecter les flux de travail hébergés par l'application. En utilisant l'objet WorkflowInspectionServices, il est possible de rechercher des activités enfants particulières dans les flux de travail, chaque activité et ses propriétés peuvent être énumérées et les métadonnées de runtime relatives aux activités peuvent être mises en cache à une heure spécifique. Cette rubrique fournit une vue d'ensemble de l'objet WorkflowInspectionServices et de son mode d'utilisation pour inspecter une arborescence d'activité.

Utilisation de WorkflowInspectionServices

La méthode GetActivities sert à énumérer toutes les activités de l'arborescence d'activité spécifiée. La méthode GetActivities retourne un énumérable qui touche toutes les activités de l'arborescence, dont les enfants, les gestionnaires des délégués, les valeurs par défaut des variables et les expressions d'arguments. Dans l'exemple suivant, une définition de workflow est créée à l'aide d'un Sequence, d'un While, d'un ForEach, d'un WriteLine et d'expressions. Une fois la définition de workflow créée, elle est appelée, puis la méthode InspectActivity est appelée.

Variable<List<string>> items = new Variable<List<string>>
{
    Default = new VisualBasicValue<List<string>>("New List(Of String)()")
};

DelegateInArgument<string> item = new DelegateInArgument<string>();

Activity wf = new Sequence
{
    Variables = { items },
    Activities =
    {
        new While((env) => items.Get(env).Count < 5)
        {
            Body = new AddToCollection<string>
            {
                Collection = new InArgument<ICollection<string>>(items),
                Item = new InArgument<string>((env) => "List Item " + (items.Get(env).Count + 1))
            }
        },
        new ForEach<string>
        {
            Values = new InArgument<IEnumerable<string>>(items),
            Body = new ActivityAction<string>
            {
                Argument = item,
                Handler = new WriteLine
                {
                    Text = item
                }
            }
        },
        new Sequence
        {
            Activities = 
            {
                new WriteLine
                {
                    Text = "Items added to collection."
                }
            }
        }
    }
};

WorkflowInvoker.Invoke(wf);

InspectActivity(wf, 0);

Pour énumérer les activités, GetActivities est appelé sur l'activité racine, et à nouveau, de façon récursive, sur chaque activité retournée. Dans l'exemple suivant, la propriété DisplayName de chaque activité et expression dans l'arborescence d'activité est écrite dans la console.

static void InspectActivity(Activity root, int indent)
{
    // Inspect the activity tree using WorkflowInspectionServices.
    IEnumerator<Activity> activities = 
        WorkflowInspectionServices.GetActivities(root).GetEnumerator();

    Console.WriteLine("{0}{1}", new string(' ', indent), root.DisplayName);

    while (activities.MoveNext())
    {
        InspectActivity(activities.Current, indent + 2);
    }
}

Cet exemple de code génère la sortie suivante :

Élément de liste 1
Élément de liste 2
Élément de liste 3
Élément de liste 4
Élément de liste 5
Éléments ajoutés à la collection.
Sequence
  Literal<List<String>>
  While
    AddToCollection<String>
      VariableValue<ICollection<String>>
      LambdaValue<String>
        LocationReferenceValue<List<String>>
    LambdaValue<Boolean>
      LocationReferenceValue<List<String>>
  ForEach<String>
    VariableValue<IEnumerable<String>>
    WriteLine
      DelegateArgumentValue<String>
  Sequence
    WriteLine
      Literal<String>

Pour récupérer une activité spécifique au lieu d'énumérer toutes les activités, la méthode Resolve est utilisée. Les méthodes Resolve et GetActivities effectuent toutes les deux une mise en cache des métadonnées si WorkflowInspectionServices.CacheMetadata n'a pas été appelé précédemment. Si la méthode CacheMetadata a été appelée, la méthode GetActivities est basée sur les métadonnées existantes. Par conséquent, si l'arborescence a été modifiée depuis le dernier appel à la méthode CacheMetadata, la méthode GetActivities peut provoquer des résultats inattendus. Si les modifications ont été apportées au workflow après l'appel à GetActivities, les métadonnées peuvent de nouveau mises en cache en appelant la méthode ActivityValidationServicesValidate. La section suivante traite de la mise en cache des métadonnées.

Mise en cache des métadonnées

La mise en cache des métadonnées pour une activité génère et valide une description des arguments, variables, activités enfants et délégués d'activité de l'activité en question. Par défaut, le runtime met en cache les métadonnées lorsqu'une activité est prête à être exécutée. Si un auteur hôte du workflow souhaite mettre préalablement en cache les métadonnées pour une activité ou arborescence d'activité, par exemple pour payer d'avance la totalité du coût, la méthode CacheMetadata peut servir à mettre en cache les métadonnées à l'heure souhaitée.