Freigeben über


Aktivitätsstrukturüberprüfung

Die Aktivitätsstrukturüberprüfung wird von Workflowanwendungsautoren verwendet, um die von der Anwendung gehosteten Workflows zu überprüfen. WorkflowInspectionServices ermöglicht die Suche nach bestimmten untergeordneten Aktivitäten in Workflows, die Auflistung einzelner Aktivitäten und ihrer Eigenschaften sowie die Zwischenspeicherung von Laufzeitmetadaten der Aktivitäten zu einem bestimmten Zeitpunkt. Dieses Thema bietet eine Übersicht über WorkflowInspectionServices und die Verwendung zur Überprüfung einer Aktivitätsstruktur.

Verwenden von WorkflowInspectionServices

Die GetActivities-Methode wird verwendet, um alle Aktivitäten in der angegebenen Aktivitätsstruktur aufzulisten. GetActivities gibt ein aufzählbares Element zurück, das alle Aktivitäten in der Struktur umfasst, darunter untergeordnete Elemente, Delegathandler, variable Standardwerte und Argumentausdrücke. Im folgenden Beispiel wird eine Workflowdefinition mithilfe der Elemente Sequence, While, ForEach<T>, WriteLine und Ausdrücken erstellt. Nachdem die Workflowdefinition erstellt wurde, wird sie aufgerufen. Anschließend wird die InspectActivity-Methode aufgerufen.

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);

Zur Auflistung der Aktivitäten wird GetActivities für die Stammaktivität und dann erneut rekursiv für jede zurückgegebene Aktivität aufgerufen. Im folgenden Beispiel wird das DisplayName-Objekt von den einzelnen Aktivitäten und Ausdrücken in der Aktivitätsstruktur in die Konsole geschrieben.

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);
    }
}

Mit diesem Beispielcode wird die folgende Ausgabe erzeugt.

List Item 1
List Item 2List Item 3List Item 4List Item 5Items added to collection.SequenceLiteral<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>
Sequenz
WriteLine
Literal<String> Um eine bestimmte Aktivität abzurufen, statt alle Aktivitäten aufzulisten, wird Resolve verwendet. Sowohl mit Resolve als auch mit GetActivities wird die Zwischenspeicherung von Metadaten ausgeführt, wenn WorkflowInspectionServices.CacheMetadata zuvor nicht aufgerufen wurde. Wenn CacheMetadata aufgerufen wurde, basiert GetActivities auf den vorhandenen Metadaten. Falls also seit dem letzten Aufruf von CacheMetadata Strukturänderungen vorgenommen wurden, kann GetActivities zu unerwarteten Ergebnissen führen. Wenn nach dem Aufruf von GetActivities Änderungen am Workflow vorgenommen wurden, können Metadaten durch Aufrufen der ActivityValidationServices Validate-Methode erneut zwischengespeichert werden. Das Zwischenspeichern von Metadaten wird im nächsten Abschnitt erläutert.

Zwischenspeichern von Metadaten

Durch die Zwischenspeicherung der Metadaten für eine Aktivität wird eine Beschreibung der Argumente, Variablen, untergeordneten Aktivitäten und Aktivitätsdelegaten der Aktivität erstellt und validiert. Metadaten werden standardmäßig von der Laufzeit zwischengespeichert, wenn eine Aktivität zur Ausführung vorbereitet wird. Wenn ein Workflowhostautor die Metadaten für eine Aktivität oder eine Aktivitätsstruktur vorher zwischenspeichern möchte, um beispielsweise den gesamten Aufwand im Voraus zu erfassen, kann CacheMetadata verwendet werden, um die Metadaten zu dem gewünschten Zeitpunkt zwischenzuspeichern.