Mittwoch, April 16, 2008

Schleifen in Workflow Foundation

Letzte Woche bin ich auf einen Effekt bei der Workflow Foundation gestoßen, der mir so nicht bewusst war und auch nur bedingt sinnvoll aus meiner Sicht.

Der Effekt tritt auf, wenn man eine Schleife benutzt und Werte innerhalb der Schleife abfragen möchte. Konkret trat das Problem auf, sobald ein IF-Branch verwendet wurde. Versucht man auf Ativitäten innerhalb der Schleife zu zugreifen, so sind die Werte/Variablen nicht gesetzt. Nach etwas Recherche in dem WF Buch von AWP, ist die Ursache klar, der ExecutionContext wird ständig neu Instanziiert. Im ExecutionContext sind alle Informationen enthalten, welchen Status hat die Ativity und Ergebnisse. Wird eine Activity geschlossen, was der normale Zustand nach der Fertigstellung ist, so ist die Activity im Status Closed. Aus dem Status Closed kann man eine Activity nicht wieder zurück in den „Executing“-Status setzen. Aus diesem Grund wird für jeden Schleifendurchlauf ein neuer Context erzeugt. In dem Buch sind entsprechende Code-Beispiele enthalten, wie man selber Schleifen erzeugen kann. Um nun aber an die Daten heranzukommen, die im aktuellen Schleifendurchlauf vorhanden sind, wird bei Schleifen eine Property zur Verfügung gestellt mittels der eine Abfrage des Inhalts möglich ist, für while-Acitivty ist es die Dynamic-Activity-Property. Eine Abfrage könnte dann etwa so aussehen:

    7  (( MyDataActivity )

    8      (( WhileActivity ) this . GetActivityByName ( "MeineWhileSchleife" ))

     9          . DynamicActivity . GetActivityByName ( "MyDataActivity" )) . MyDataProperty

Sieht kompliziert aus, aber leider bekommt man von der GetActivityByName-Methode nur den Activity-Typ, so dass die Casts notwendig sind. Leider habe ich kein Beispiel parat, aber zumindest ein bisschen Code für eine eigene Schleife werde ich nach liefern.

Evtl. morgen dann noch ein Posts zu Trouble mit den Custom-Activity und das laden im Designer (Custom Designer).

Update
Hier ist noch ein kleiner Nachtrag, leider nicht der Code der While-Activity. Ich hatte leider vergessen die entsprechende Anweisung zu erstellen. Dafür kann ich als alternative aber einige Artikel bzw. Auszüge aus dem Buch Essential Windows Workflow Foundation bieten, auf die gestoßen bin. Die Informationen sind unter http://codeidol.com/other/essential-windows-workflow-foundation/ einzusehen.Die While-Activity ist als Beispiel im Artikel Activity Execution Context beschrieben.

Keine Kommentare: