Aktivitätserstellungsoptionen in WF
.NET Framework 4.6.1 stellt mehrere Optionen zum Erstellen von benutzerdefinierten Aktivitäten bereit. Die richtige Methode zum Erstellen einer bestimmten Aktivität hängt davon ab, welche Laufzeitfunktionen erforderlich sind.
Festlegen der Basisaktivitätsklasse für das Erstellen von benutzerdefinierten Aktivitäten
In der folgenden Tabelle werden die Funktionen aufgeführt, die in den benutzerdefinierten Aktivitätsbasisklassen verfügbar sind.
Basisaktivitätsklasse | Verfügbare Funktionen |
---|---|
Activity | Kombiniert Gruppen von vom System bereitgestellten und benutzerdefinierten Aktivitäten in einer zusammengesetzten Aktivität. |
CodeActivity | Implementiert imperative Funktionalität durch das Bereitstellen einer Execute-Methode, die überschrieben werden kann. Bietet außerdem Zugriff auf die Überwachung, Variablen und Argumente. |
NativeActivity | Stellt alle Funktionen der CodeActivity sowie zum Abbrechen der Ausführung einer Aktivität oder einer untergeordneten Aktivität, zur Verwendung von Lesezeichen und zum Planen von Aktivitäten, Aktivitätsaktionen und Funktionen bereit. |
DynamicActivity | Stellt einen DOM-ähnlichen Ansatz für das Erstellen von Aktivitäten bereit, der eine Schnittstelle mit dem WF-Designer und den Laufzeitvorgängen über ICustomTypeDescriptor bietet. Damit können neue Aktivitäten ohne die Definition neuer Typen erstellt werden. |
Erstellen von Aktivitäten mit Activity
Bei Aktivitäten, die von Activity abgeleitet werden, wird die Funktionalität aus der Kombination anderer vorhandener Aktivitäten zusammengesetzt. Bei diesen Aktivitäten kann es sich um benutzerdefinierte Aktivitäten und Aktivitäten aus der .NET Framework 4.6.1-Aktivitätsbibliothek handeln. Das Zusammenfügen dieser Aktivitäten stellt die grundlegendste Möglichkeit für das Erstellen benutzerdefinierter Funktionalität dar. Der Ansatz wird in der Regel angewendet, wenn eine visuelle Entwurfsumgebung zum Erstellen von Workflows verwendet wird.
Erstellen von Aktivitäten mit CodeActivity oder AsyncCodeActivity
Aktivitäten, die von CodeActivity oder von AsyncCodeActivity abgeleitet werden, können imperative Funktionalität implementieren, indem sie die Execute-Methode mit benutzerdefiniertem imperativem Code überschreiben. Der benutzerdefinierte Code wird ausgeführt, wenn die Aktivität von der Laufzeit ausgeführt wird. Auf diese Weise erstellte Aktivitäten können auf benutzerdefinierte Funktionalität zugreifen, jedoch nicht auf sämtliche Funktionen der Laufzeit. So verfügen sie nicht über Vollzugriff auf die Ausführungsumgebung und sind nicht in der Lage, untergeordnete Aktivitäten zu planen, Lesezeichen zu erstellen oder die Cancel-Methode und die Abort-Methode zu unterstützen. Wenn eine CodeActivity ausgeführt wird, verfügt diese über Zugriff auf eine eingeschränkte Version der Ausführungsumgebung (durch die CodeActivityContext-Klasse oder die AsyncCodeActivityContext-Klasse). Mit der CodeActivity erstellte Aktivitäten verfügen über Zugriff auf Argument- und Variablenauflösung, Erweiterungen und Überwachung. Asynchronen Aktivitäten können mit AsyncCodeActivity geplant werden.
Erstellen von Aktivitäten mit NativeActivity
Mit Aktivitäten, die von der NativeActivity abgeleitet werden (etwa von der CodeActivity abgeleitete Aktivitäten), wird eine imperative Funktionalität erzeugt, indem Execute überschrieben wird. Es besteht jedoch über den NativeActivityContext, der an die Execute-Methode weitergegeben wird, Zugriff auf die gesamte Funktionalität der Workflowlaufzeit. Dieser Kontext bietet Unterstützung für das Planen und Abbrechen von untergeordneten Aktivitäten, das Ausführen von ActivityAction- und ActivityFunc<TResult>-Objekten, das Übertragen von Transaktionen in einen Workflow, das Aufrufen asynchroner Prozesse, das Abbrechen der Ausführung, den Zugriff auf Ausführungseigenschaften und -erweiterungen sowie Lesezeichen (Handles zum Fortsetzen von angehaltenen Workflows).
Erstellen von Aktivitäten mit DynamicActivity
Im Gegensatz zu den anderen drei Aktivitätstypen wird Funktionalität nicht durch das Ableiten neuer Typen von der DynamicActivity erstellt (die Klasse ist versiegelt), sondern durch das Zusammenfügen von Funktionalität in der Properties-Eigenschaft und der Implementation-Eigenschaft mit einem Dokumentobjektmodell (DOM) für Aktivitäten.
Erstellen von Aktivitäten, die ein Ergebnis zurückgeben
Viele Aktivitäten müssen nach ihrer Ausführung ein Ergebnis zurückgeben. Es ist möglich, zu diesem Zweck ein benutzerdefiniertes OutArgument<T> für eine Aktivität anzugeben, aber es empfiehlt sich, stattdessen die Activity<TResult> oder eine Ableitung von der CodeActivity<TResult> oder NativeActivity<TResult> zu verwenden. Jede dieser Basisklassen verfügt über ein OutArgument<T> mit dem Namen Result, das die Aktivität für den Rückgabewert verwenden kann. Aktivitäten, die ein Ergebnis zurückgeben, sollten nur verwendet werden, wenn nur ein Ergebnis aus einer Aktivität zurückgegeben werden muss. Wenn mehrere Ergebnisse zurückgegeben werden müssen, sollten stattdessen separate OutArgument<T>-Member verwendet werden.