2009-05-14 4 views
2

Je travaille avec un workflow de machine d'état et en utilisant le service ExternalDataExchange pour gérer les événements dans l'hôte et obtenir des données dans le flux de travail via eventargs.Comment puis-je extraire des données d'un flux de travail de machine d'état avant que le flux de travail n'entre dans son état terminé?

Cependant, maintenant j'ai besoin d'obtenir des données sur le flux de travail et j'ai des difficultés.

Les paramètres de sortie sont uniquement disponibles dans l'événement de workflow terminé, mais mon flux de travail n'est pas terminé. L'hôte déclenche un événement avec des données et attend essentiellement que le flux de travail termine le traitement de l'événement (planificateur manuel). Dans ma gestion particulière de l'événement dans le flux de travail, il effectue une validation et si cette validation échoue, il ne passe PAS à l'état suivant, mais je dois pouvoir renvoyer les résultats de la validation à l'application hôte.

Un exemple de ce que je suis en train d'accomplir ressemblerait à ceci:

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

Il convient également de noter que mon hôte est en fait une application ASP.NET MVC, donc je suis en train de évitez de câbler des événements sur mon contrôleur/page directement pour gérer les services locaux à partir du workflow appelant, mais je ne suis pas totalement opposé à cela si c'est comme cela que cela doit être fait.

Répondre

3

On dirait que j'ai une solution de travail pour cela. Fondamentalement mon WorkflowRuntimeManager est plus ou moins le même que celui présenté par Bruce Bukovics dans son livre Pro WF Windows Workflow dans .NET 3.5.

J'ai fini par créer un nouveau service et l'ajouter à l'exécution du workflow. Ce service permet à mon flux de travail de déclencher un événement dans mon application qui lui permet de renvoyer tout IDictionary à mon application hôte.

Cet événement est à son tour pris en charge par le WorkflowRuntimeManager où il prend ensuite les résultats et les associe à WorkflowInstance approprié et où il devient disponible pour l'application elle-même une fois la méthode Workflow renvoyée.

J'ai joint l'implémentation de service ici pour toute autre personne qui voudrait dupliquer cette fonctionnalité. Ou même mieux, si quelqu'un peut trouver une meilleure façon de le faire, s'il vous plaît faites le moi savoir.

public interface ISendDataService 
{ 
    event EventHandler<ReceivedDataEventArgs> ReceivedDataEvent; 
    void SendData(Guid instanceId, IDictionary<string, object> data); 
} 

public class SendDataService : ISendDataService 
{ 
    public event EventHandler<ReceivedDataEventArgs> ReceivedDataEvent; 

    private void OnReceivedDataEvent(Guid instanceId, IDictionary<string, object> data) 
    { 
     if (ReceivedDataEvent != null) 
      ReceivedDataEvent(null, new ReceivedDataEventArgs(instanceId, data)); 
    } 

    public void SendData(Guid instanceId, IDictionary<string, object> data) 
    { 
     OnReceivedDataEvent(instanceId, data); 
    } 
} 

public class ReceivedDataEventArgs : EventArgs 
{ 
    public ReceivedDataEventArgs() 
    { 
    } 

    public ReceivedDataEventArgs(Guid instanceId, IDictionary<string, object> data) 
    { 
     InstanceId = instanceId; 
     Data = data; 
    } 

    public Guid InstanceId { get; set; } 
    public IDictionary<string, object> Data { get; set; } 
} 
+0

Cool! J'aime le fait que vous avez utilisé IDictionary comme l'une des faiblesses que je vois avec le service WF Interace du livre WF Pro, c'est que les listes de paramètres peuvent devenir assez longues si vous devez déplacer des données dans et hors. –

0

Au-dessus de solution viable pour le service ManuakWorkflowScheduler - exécution synchrone?

+0

Oui. C'est précisément comme ça que je l'utilisais. Le problème était plutôt de savoir comment extraire les données d'un workflow de machine d'état à mi-flux. Je recommande le livre de Bruce Bukovics si vous êtes intéressé par l'exécution de workflows car il a une très bonne implémentation d'un wrapper d'exécution. –

Questions connexes