2009-05-14 2 views
2

Ich arbeite mit einem State-Machine-Workflow und verwende den ExternalDataExchange-Service, um Ereignisse im Host zu behandeln und über Eventargs Daten in den Workflow zu bekommen.Wie erhalte ich Daten aus einem Workflow für Zustandsautomaten, bevor der Workflow in den abgeschlossenen Zustand übergeht?

Jetzt muss ich jedoch Daten aus dem Workflow bekommen und ich habe Schwierigkeiten.

Die Ausgabeparameter sind nur im Ereignis "Workflow abgeschlossen" verfügbar, aber mein Workflow ist nicht vollständig. Der Host löst ein Ereignis mit einigen Daten aus und wartet im Wesentlichen darauf, dass der Workflow die Verarbeitung des Ereignisses beendet (manueller Scheduler). Bei meiner speziellen Behandlung des Ereignisses im Workflow wird eine Validierung durchgeführt, und sollte diese Validierung fehlschlagen, wird NICHT in den nächsten Status gewechselt, sondern ich muss die Validierungsergebnisse an die Hostanwendung zurücksenden können.

Ein Beispiel dafür, was ich versuche, dies würde so aussehen zu erreichen:

wird
OrderWorkflow 
    PendingOrderState 
     ImportOrderEvent 
      - If the order passes validation move to CompletedState 
      - Else return the validation results to the host (how?) 
    CompletedState 

Es sollte auch darauf hingewiesen, dass mein Gastgeber in der Tat ist eine Anwendung ASP.NET MVC, so ich versuche, Vermeiden Sie die direkte Verbindung von Ereignissen auf meinem Controller/meiner Seite, um lokale Dienste vom Workflow-Aufruf aus zu behandeln, aber ich bin nicht völlig dagegen, wenn es so gemacht werden muss.

Antwort

3

Sieht aus wie ich eine funktionierende Lösung dafür habe.

Grundsätzlich ist mein WorkflowRuntimeManager mehr oder weniger der gleiche wie derjenige, den Bruce Bukovics in seinem Buch Pro WF Windows Workflow in .NET 3.5 vorgestellt hat.

Ich habe am Ende einen neuen Service erstellt und es der Workflow-Laufzeit hinzugefügt. Dieser Dienst ermöglicht es meinem Workflow, ein Ereignis in meiner Anwendung auszulösen, das es ermöglicht, IDictionary zurück an meine Host-Anwendung zu übergeben.

Dieses Ereignis wird wiederum vom WorkflowRuntimeManager übernommen, wo es wiederum die Ergebnisse übernimmt und sie der entsprechenden WorkflowInstance zuordnet und wo es für die Anwendung verfügbar wird, sobald die Workflow-Methode zurückgegeben wird.

Ich habe die Service-Implementierung hier für alle anderen hinzugefügt, die diese Funktionalität möglicherweise duplizieren möchten. Oder noch besser, wenn jemand einen besseren Weg findet, lass es mich wissen.

+0

Cool! Ich mag die Tatsache, dass Sie IDictionary als eine der Schwächen verwendet haben, die ich mit WF Interace Service aus dem WF Pro Buch sehe, ist, dass Parameterlisten ziemlich lang werden können, wenn Sie Daten ein- und auslagern müssen. –

0

Die obige Lösung funktioniert für den ManuakWorkflowScheduler Service - synchrone Ausführung?

+0

Ja. Genau so habe ich es benutzt. Das Problem bestand eher darin, wie Daten aus einem State-Machine-Workflow im Midstream abgerufen werden können. Ich empfehle Bruce Bukovics Buch, wenn Sie Workflows ausführen möchten, da es eine ziemlich gute Implementierung eines Laufzeit-Wrappers hat. –