Einstieg zur Workflow Foundation 4 : Bookmarks

by Gregor Biswanger 22. Dezember 2010 08:19

Für lang laufende Workflows gebühre dem WF4 Bookmarks die Aufmerksamkeit. Denn mittels Bookmarks kann der Workflow Prozess kurzerhand gestoppt werden, so dass es im Programmcode weitergehen kann. Bei den meisten Szenarios wird hierbei auf eine Benutzereingabe gewartet. Ist die Eingabe erfolgt, wird die WF Hoster Instanz darum gebeten genau an der Workflow stelle zurückzuspringen wo als letztes ein Bookmark (Lesezeichen) gesetzt wurde.

Um das ganze kurz zu Verbildlichen habe ich eine kleine Skizze auf dem Whiteboard gezeichnet (siehe Abb.1).

 

image

Abb. 1 – Übersicht zum Bookmark Prozess

Eine kurze Erläuterung zur Skizze: Auf der Code-Ebene (Punkt 1) startet die Workflow Hoster Instanz den Workflow (Punkt 2). Der Workflow arbeitet die einzelnen Activities ab. Ein Activity erwartet Daten von einem Anwender. Es kann allerdings lange Zeit vergehen bis diese Daten zur Verfügung gestellt werden können. Daher setzt das Activity ein Bookmark (Lesezeichen) bei der allgemeinen Workflow Runtime (Punkt 3). Beim setzen des Bookmarks wird der Workflow sofort gestoppt. Wenn dann zu einem späteren Zeitpunkt die Daten zur Verfügung stehen, wird der Workflow Hoster Instanz ein Aufruf zum jeweiligen Bookmark getätigt (Punkt 4). Der Workflow wird sofort an der Stelle fortgesetzt wie es beim Bookmark hinterlegt wurde (Punkt 5).

Ein Bookmark steht natürlich nur so lange im Speicher der Workflow Hoster Instanz, so lange die Application im System läuft. Geht es darum das zu einem späteren Zeitpunkt die Anwendung erneut gestartet wird und dann die Daten vorhanden sind, ist hierbei das Thema Workflow Foundation 4 Persistenz interessant. Ein Blog-Post zu diesem Thema folgt.

Um nun das Feature Bookmarks selbst hautnah spürbar zu erleben, ist das folgende Beispiel WorkflowBookmarkExample zum Mach-Mit-Coden geradezu ideal.

 

Beispiel: WorkflowBookmarkExample

Dazu wird Visual Studio 2010 geöffnet und ein neues Projekt angelegt. Als Template wird unter “Workflow” – “Workflow Console Application” gewählt. Als Name wird “WorkflowBookmarkExample” verwendet.

 

SNAGHTMLb67f5

Abb. 2 - Neues “Workflow Console Application” Projekt erzeugen.

 

Workflow definieren

 

Folgende Schritte sollen nun dem Workflow definiert werden:

  1. Dem Workflow ein Flowchart Activity setzen.
  2. Dem Flowchart Activity ein WriteLine Activity hinzufügen und als Expression setzen:
    ”Bitte Passwort eingeben:”
  3. Direkt unter der WriteLine Activity ein FlowDecision Activity hinzufügen und zwei weitere WriteLine Activities setzen die folgende Expression bekommen:
    ”Passwort richtig!” und “Passwort falsch!”
  4. Dann alle Activities miteinander verknüpfen, so das der Workflow Ablaufprozess informiert ist in welcher Reihenfolge abgearbeitet werden soll. Bei dem WriteLine Activity das für die Ausgabe vom falschen Passwort informiert, soll der Prozess wieder zum ersten Activity zurück springen.

 

Ist alles korrekt umgesetzt worden sollte es im Designer aussehen wie unter Abb.3 veranschaulicht wird.

 

image

Abb. 3 – Passwortabfrage-Prozess.

 

Bei Abb. 3 wird verdeutlicht das ein wichtiger Prozessschritt noch fehlt. Genau jener der die Daten (das Passwort) vom Anwender vermittelt. Daher soll vorerst eine allgemeine Variable zur Verarbeitung dienen. Dem Flowchart wird eine Variable mit Password und dem Typ String gesetzt (Abb. 4).

 

 

image

Abb. 4 – Variable für das Passwort setzen.

 

Dann muss ein eigenes Activity für die Vermittlung der Passwortabfrage geschrieben werden. Dazu wird eine neue Klasse mit dem Namen GetPasswort angelegt.

Beim Blog-Post “Einstieg zur Workflow Foundation 4 : Überblick zu Activities” wurde bereits beschrieben das nur die Basisklasse NativeActivity für “Long Running Unit of Work”-Szenarien bedacht ist. Daher leiten wir direkt davon ab und geben mittels Generics-Erweiterung gleich unseren Rückgabetyp string mit an.

Als nächstes wird von unserem Activity auch erwartet das von außen der Bookmarkname gesetzt werden kann. Dazu wird ein InArgument vom Typ String mit dem Namen "Bookmarkname” angelegt.

Damit der Workflow auch in Leerlaufmodus gestoppt werden kann, muss das bool Property CanInduceIdle überschreiben werden. Das wird dann fest manipuliert, so das immer ein True-Wert zurück gegeben wird.

Bei der allgemeinen Execute-Methode wird dann auf die Workflow Runtime mittels context-Instanz zugegriffen. Hier wird die Methode CreateBookmark bereitgestellt. An dieser Stelle wird der Name des Bookmarks definiert und welche Methode beim Zurückkehren aufgerufen werden soll.

Als Methode wird ReturnPasswortCallback definiert. Das sich strickt an den delegierten Aufbau der Parameter gehalten werden muss (siehe Listing 1). Die Parameter überreichen aus der Code-Ebene die Daten (object value) die dann dem Result Property gegeben wird.

 

   1:  public class GetPasswort : NativeActivity<string>
   2:  {
   3:      public InArgument<string> Bookmarkname { get; set; }
   4:   
   5:      protected override bool CanInduceIdle
   6:      {
   7:          get { return true; }
   8:      }
   9:   
  10:      protected override void Execute(NativeActivityContext context)
  11:      {
  12:          context.CreateBookmark(Bookmarkname.Get(context), ReturnPasswortCallback);
  13:      }
  14:   
  15:      private void ReturnPasswortCallback(NativeActivityContext context, Bookmark bookmark, object value)
  16:      {
  17:          Result.Set(context, value as string);
  18:      }
  19:  }

Listing 1 – Das GetPasswort Activity setzt ein Bookmark und bei der Rückkehr aus der Code-Ebene wird das Passwort bekannt gegeben.

 

Nach der Fertigstellung des Activities wird wieder zum Designer zurückgekehrt. Dann muss das Projekt erneut gebuildet werden [Strg] + [Shift] + [B]. Dann steht das selbst geschriebene Activity in der Toolbox bereit und kann dann dem Workflow hinzugefügt werden (Punkt 1). Die Verknüpfungen zum Ablauf der Activities müssen nun für das neue Activity neu gesetzt werden. Auch wird dem GetPasswort Activity nun der Bookmarkname „BookmarkPassword“ und der Result-Wert der Variable Password definiert (Punkt 3).

 

SNAGHTML1854f3

Abb. 5 – Das GetPasswort Activity wird hinzugefügt.

 

Zum Schluss wird der FlowDescision noch die Condition mit Passwort = “dotnet” gesetzt. Das GetPasswort Activity bekommt auch noch eine besser verständlichere Beschriftung “Frage nach Passwort” und der Workflow ist fertig.

 

image

Abb. 6 – Der letzte Feinschliff der Workflow.

 

Der Workflow ist fertig. Der Workflow Hoster noch nicht. Denn das Bookmark Feature steht nur dem erweiterten Workflow Hoster WorkflowApplication bereit. Deshalb wird von dessen eine Instanz benötigt. Dieser startet wie gewohnt die Workflow. Sollte die Workflow gestoppt werden, wird der nächste Code durchlaufen. Dieser wird durch Console.ReadLine() die Eingabe des Anwenders abverlangen und anschließend den Wert zur WF Hoster Instanz überreichen worin mittels ResumeBookmark zurück zum Workflow gewechselt wird. Listing 2 zeigt die Implementierung dazu.

 

   1:  class Program
   2:  {
   3:      static void Main(string[] args)
   4:      {
   5:          var workflowApplicationHoster = new WorkflowApplication(new Workflow1());
   6:          workflowApplicationHoster.Run();
   7:   
   8:          while (true)
   9:          {
  10:              string value = Console.ReadLine();
  11:              workflowApplicationHoster.ResumeBookmark("BookmarkPassword", value);
  12:          }
  13:      }
  14:  }

Listing 2 – Workflow Hoster Instanz und eine Abfrage der Benutzereingaben.

 

Jetzt kann wie gewohnt die Anwendung mittels [F5]-Tastendruck ausgeführt werden.

 

SNAGHTML7bc717

Abb. 7 - Ausgabe der Passwortabfrage-Logik.



Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
kick it on dotnet-kicks.de

Kommentare

Powered by BlogEngine.NET 1.4.5.0
Theme by Extensive SEO

Über den Autor

Gregor Biswanger

Microsoft MVP für Client App Dev
XING

Gregor Biswanger (Microsoft MVP für Client App Dev) ist freier Consultant, Trainer, Autor und Speaker.


Seine Schwerpunkte liegen im Bereich der .NET-Architektur, agilen Prozessen und XAML. Er veröffentlichte vor kurzem seine DVD´s mit Video-Trainings zum Thema „Meine erste Windows 8 App“, „Windows Store Apps mit XAML und C#“ und „WPF 4.5 und Silverlight 5“ bei Addison-Wesley von video2brain.


Biswanger ist auch im Auftrag von Intel GmbH als Technologieberater für die Intel Developer Zone aktiv und ist Leader bei der Ingolstädter .NET Developers Group (INdotNET). 

 

Video über mich:
http://www.youtube.com/watch?v=mx_6SiiLxjk


Basta! 2011 Speaker

CLIPer

MCTS
Windows SharePoint Services 3.0 – Application Development (MCTS)