Externe Methode richtig in einem Workflow verwenden

Da ich gerade dabei bin eine vorhandene Businesslogik workflowfähig zu machen, habe ich mich mit dieser Thematik in den vergangenen Tagen etwas genauer beschäftigt.

Wie es bei einer solchen Umstellung meistens ist, bleibt allerdings nicht viel Zeit, sich in eine neue Technologie einzuarbeiten, ganz im Gegenteil… Das Ergebnis muss schnellst möglich fehlerfrei verfügbar sein.

Aus diesem Grund entschied ich mich dazu in der ersten Version die Workflows zu erstellen und dann direkt auf die Methoden der Businesslogik zuzugreifen.

Hier einmal kurz die Schritte die zum korrekten verwenden von “externen” Methoden benötigt werden.

1. Die Rahmenbedingungen

Es gibt zwei Voraussetzungen, die erfüllt sein müssen damit eine Methode als externe Methode in einem Workflow verwendet werden kann

  1. Die Klasse muss ein Vertrag (Interface) haben
  2. Das benötigte Interface muss mit dem Attribut ExternalDataExchange dekoriert sein
    1. logischerweise muss die gewünschte Methode in dem dekorierten Interface sein…

Ein einfaches IMessageLogic Interface würde demnach wie folgt aussehen

[ExternalDataExchange]
public interface IMessageLogic
{
      bool IsMessageValid(string message, string recipient);
      void SendMessage(string message, string recipient);
}

2. Die Konfiguration

Anhand eines einfachen sequenziellen Workflows möchte ich nun zeigen wie man die Methode IsMessageValid  in einem Workflow verwenden kann.

1. dazu wird ein neuer Workflow angelegt.

Neuen sequenziellen Workflow anlegen

Nachdem der Workflow hinzugefügt wurde präsentiert sich der Visual Studio Workflow Designer

Visual Studio 2008 Workflow Designer

2. Um eine externe Methode in einem Workflow aufzurufen benötigt man eine Komponente, welche die Interaktion handelt, hierfür steht die CallExternalMethodActivity zur Verfügung. Um eine Instanz dieser Activity zum Workflow hinzuzufügen ziehen Sie das entsprechende Symbol aus der ToolBox in den Workflow Designer von Visual Studio 2008

CallExternalMethodActivityDas rote Ausrufezeichen besagt, dass nicht alle Einstellungen der Activity gemacht wurden. Solange auf dem Workflow ein solches Ausrufezeichen zu sehen ist lässt dieser sich auch nicht kompilieren!

Wenn eine Activity im Workflow Designer markiert ist, werden dessen Eigenschaften im Eigenschaftenfenster von Visual Studio angezeigt. Für die aktuelle Activity stehen die folgenden Eigenschaften zur Verfügung

Eigenschaft Beschreibung

Name

Name der Activity Instanz
Description Eine Beschreibung dieser Activity
Enabled Ist diese Activity aktiv?
InterfaceType Der zu verwendende Vertrag
MethodInvoking Methode die vor der eigentlichen Ausführung der gewünschten Methode aufgerufen werden soll
MethodName Name der auszuführenden Methode im Vertrag

In der Standardeinstellung sind InterfaceType und MethodName mit einem roten Ausrufezeichen gekennzeichnet das bedeutet, dass diese Properties bearbeitet werden müssen.

3. Durch einen Doppelklick in den Property-Value der Eigenschaft InterfaceType wird der Visual Studio 2008 Typ-Such Dialog geöffnet. Hier muss nun das zuvor erstellte Interface ausgewählt werden.

.Net Typ-Suche

4. Aus der DropDownListe für MethodName kann nun die gewünschte Methode ausgewählt werden. Sobald dies geschehen ist ändert sich die Eigenschaftenliste, Visual Studio erstellt weitere Properties entsprechend dem Return-Value und den Parametern der gewählten Methode.

5. Um die Flexibilität des Workflows zu wahren, habe ich mich dazu entschieden die Parameter der Methode nicht einfach anzugeben sonder über eine Bindung an die Activity zu hängen. Als Grundlage für die Bindung habe ich entsprechende Instanzen von DependencyProperty genommen.

Die gebundene Eigenschaft ReturnValue

 

 

3. Die Workflow Hostanwendung

Nachdem alle Parameter und das Return-Value konfiguriert sind, muss die Hostanwendung des Workflows natürlich noch die konkrete Implementierung des IMessageLogic Interfaces an den Workflow weitergeben. Um dies zu realisieren gibt es die ExternalDataExchangeService Klasse.

Einer Instanz der Klasse kann mittels der Methode AddService eine konkrete Implementierung des gewünschten Vertrages mitgegeben werden. Die Instanz von ExternalDataExchangeService wiederum wird mit der AddService Methode der WorkflowRuntime mitgegeben.

ExternalDataExchangeService myService = new ExternalDataExchangeService();
myService.AddService(new MessageLogicImpl());
myWorkflowRuntime.AddService(myService);

 

Als letzter Schritt bleibt lediglich die benötigten Parameter in den Workflow rein zugeben, dies wird wie immer in der Workflow Foundation über ein Dictionary vom Typ Dictionary<String, object> realisiert.

Dictionary<String, object> myParameters = new Dictionary<String, object>();
parameters.Add(“MyMessage”, “some message content…”);
parameters.Add(“MyRecipient”, “info@thorsten-hans.de”);

 

 

Das Parameters Dictionary muss nun nur noch als Parameter an die Methode CreateWorkflow der WorkflowRuntime übergeben werden und schon ruft der Workflow eine externe Methode mit den korrekten Parametern auf.

Wenn man das ganze 1-2 mal gemacht hat, sitzen die Schritte und somit ist schnell eine externe Methode in einen Workflow eingebaut.

 

kick it on dotnet-kicks.de

 

Published Mittwoch, 29. April 2009 10:56 von ThorstenHans

Kommentare

Keine Kommentare

Kommentar abgeben

(verpflichtend) 
(verpflichtend) 
(optional)
(verpflichtend)