Benutzerdefinierte Zusammensetzungen mit NativeActivity
Dieses Thema gilt für Windows Workflow Foundation 4.
In diesem Beispiel wird veranschaulicht, wie eine NativeActivity geschrieben wird, die andere Activity-Objekte plant, um den Fluss der Ausführung eines Workflows zu steuern. Zur Veranschaulichung dieses Vorgangs werden in diesem Beispiel zwei häufige Ablaufsteuerungen verwendet: Sequence und While.
Beispieldetails
Beginnend bei MySequence
ist die erste Sache, die zu beachten ist, dass diese Ablaufsteuerung von NativeActivity abgeleitet wird. NativeActivity ist das Activity-Objekt, das die volle Bandbreite der ActivityRuntime über den NativeActivityContext verfügbar macht, der an die Execute
-Methode übergeben wird.
MySequence
macht eine öffentliche Auflistung von Activity-Objekten verfügbar, die vom Workflowautor aufgefüllt werden. Bevor der Workflow ausgeführt wird, ruft die Workflowlaufzeit die CacheMetadata-Methode in jeder Aktivität in einem Workflow auf. Während dieses Prozesses legt die Laufzeit Beziehungen zwischen übergeordneten und untergeordneten Elementen für Datenbereiche und Lebensdauerverwaltung fest. Die Standardimplementierung der CacheMetadata-Methode verwendet die TypeDescriptor-Instanzklasse für die MySequence
-Aktivität, um eine beliebige öffentliche Eigenschaft des Typs Activity hinzuzufügen, oder IEnumerable<Activity> als untergeordnete Elemente der MySequence
-Aktivität.
Immer dann, wenn eine Aktivität eine öffentliche Auflistung von untergeordneten Aktivitäten verfügbar macht, ist es wahrscheinlich, dass diese untergeordneten Aktivitäten ihren Zustand freigeben. Für die übergeordnete Aktivität, in diesem Fall MySequence
, besteht eine empfohlene Vorgehensweise darin, auch eine Auflistung von Variablen verfügbar zu machen, durch die die untergeordneten Aktivitäten dies erreichen können. Genau wie untergeordnete Aktivitäten fügt die CacheMetadata-Methode öffentliche Eigenschaften des Typs Variable oder IEnumerable<Variable> als Variablen, die der MySequence
-Aktivität zugewiesen sind, hinzu.
Neben den öffentlichen Variablen, die von den untergeordneten Elementen von MySequence
bearbeitet werden, muss MySequence
auch die Position aufzeichnen, an der es sich bei der Ausführung der untergeordneten Elemente befindet. Hierfür wird eine private Variable, currentIndex
, verwendet. Diese Variable wird als Teil der MySequence
-Umgebung registriert, indem der AddImplementationVariable-Methode innerhalb CacheMetadata-Methode der MySequence
-Aktivität ein Aufruf hinzugefügt wird. Die Activity-Objekte, die der Activities
-Auflistung von MySequence
hinzugefügt werden, können nicht auf Variablen zugreifen, die auf diese Weise hinzugefügt wurden.
Wenn MySequence
von der Laufzeit ausgeführt wird, ruft die Laufzeit die Execute-Methode auf und übergibt einen NativeActivityContext. Der NativeActivityContext ist der Proxy der Aktivität in der Laufzeit zum Dereferenzieren von Argumenten und Variablen sowie zum Planen von anderen Activity-Objekten oder ActivityDelegates
. MySequence
verwendet eine InternalExecute
-Methode zum Kapseln der Logik des Planens des ersten untergeordneten Elements sowie aller nachfolgenden untergeordneten Elemente in einer einzigen Methode. Es wird durch Dereferenzieren des currentIndex
gestartet. Wenn dieser der Anzahl in der Activities
-Auflistung entspricht, wird die Sequenz beendet, die Aktivität gibt einen Wert zurück, ohne Aufgaben zu planen, und er wird von der Laufzeit in den Zustand Closed verschoben. Wenn der currentIndex
geringer als die Anzahl von Aktivitäten ist, wird das nächste untergeordnete Element aus der Activities
-Auflistung abgerufen, und MySequence
ruft ScheduleActivity auf und übergibt das zu planende untergeordnete Element sowie einen CompletionCallback, der auf die InternalExecute
-Methode zeigt. Schließlich wird der currentIndex
inkrementiert, und die Steuerung wird zurück an die Laufzeit gegeben. Solange eine Instanz von MySequence
über ein geplantes untergeordnetes Activity-Objekt verfügt, wird diese von der Laufzeit als im ausgeführten Zustand betrachtet.
Wenn die untergeordnete Aktivität abgeschlossen wird, wird der CompletionCallback ausgeführt. Die Schleife fängt wieder von vorne an. Wie auch Execute
, verwendet ein CompletionCallback einen ActivityExecutionContext, sodass die Implementierung Zugriff auf die Laufzeit erhält.
MyWhile
unterscheidet sich von MySequence
dahingehend, dass es ein einzelnes Activity-Objekt wiederholt plant und einen Activity<booleschen> Wert mit dem Namen Condition
verwendet, um zu ermitteln, ob diese Planung stattfinden soll. Wie auch MySequence
, verwendet MyWhile
eine InternalExecute
-Methode, um seine Planungslogik zu zentralisieren. Es plant den Condition
Activity<booleschen> Wert mit einem CompletionCallback<booleschen> Wert mit dem Namen OnEvaluationCompleted
. Wenn die Ausführung von Condition
abgeschlossen ist, wird das Ergebnis durch diesen CompletionCallback in einem stark typisierten Parameter mit dem Namen result
verfügbar. Wenn true
, MyWhile
ScheduleActivity aufruft, werden das Body
Activity-Objekt und InternalExecute
als CompletionCallback übergeben. Wenn die Ausführung von Body
abgeschlossen ist, wird Condition
erneut in InternalExecute
geplant, und die Starte beginn erneut von vorne. Wenn der Condition
false zurückgibt, gibt eine Instanz von MyWhile
die Steuerung an die Laufzeit zurück, ohne den Body
zu planen, und die Laufzeit verschiebt diesen in den Zustand Closed.
So richten Sie das Beispiel ein, erstellen es und führen es aus
Öffnen Sie die Beispielprojektmappe "Composite.sln" in Visual Studio 2010.
Erstellen Sie die Projektmappe, und führen Sie sie aus.
Hinweis: |
---|
Die Beispiele sind möglicherweise bereits auf dem Computer installiert. Überprüfen Sie das folgende (standardmäßige) Verzeichnis, bevor Sie fortfahren.
<Installationslaufwerk>:\WF_WCF_Samples
Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)- und WF-Beispiele herunterzuladen. Dieses Beispiel befindet sich im folgenden Verzeichnis.
<Installationslaufwerk>:\WF_WCF_Samples\WF\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity
|