Prelevare parametri di output da un workflow di WF

di Giuseppe Marchi, in Windows Workflow Foundation, UserScript,

Allo stesso modo in cui possono essere passati dei parametri di input ad un workflow basato sul framework di Windows Workflow Foundation, possono anche essere recuperati dei valori al termine dell'esecuzione di ogni singolo flusso, il tutto senza dover implementare meccanismi di scambio di informazioni tramite servizi specifici in grado di far comunicare il runtime di Workflow Foundation e l'applicazione host; tali informazioni sono appunto dette parametri di output.

Chiaramente, questi parametri di output possono essere recuperati solamente alla fine del flusso di lavoro, precisamente durante l'evento WorkflowCompleted. Tale evento infatti, una volta che viene gestito, vede come classe di argomenti la WorkflowCompletedEventArgs. Tra questi argomenti abbiamo a disposizione la proprietà OutputParameters, una collezione di elementi di tipo chiave-valore che ci permette di recuperare i valori di tutte le proprietà del workflow (dichiarate con visibilità public) a workflow completato.

Come abbiamo appena accennato, siccome i valori di output del nostro workflow si riferiscono direttamente alle proprietà della classe che rappresenta il nostro flusso di lavoro, dobbiamo fare in modo di avere definite tutte le proprietà che vogliamo utilizzare all'interno del nostro workflow, per poi utilizzarne i valori sia come input che come output.

public sealed partial class NumeriPari: SequentialWorkflowActivity
{
  private string risultato;
  private int numeroDaControllare;

  //parametro di input
  public int NumeroDaControllare
  {
    get { return numeroDaControllare; }
    set { numeroDaControllare = value; }
  }

  //parametro di output
  public string Risultato
  {
    get { return risultato; }
    set { risultato = value; }
  }

  public NumeriPari()
  {
    InitializeComponent();
  }

  private void numeroPari_ExecuteCode(object sender, EventArgs e)
  {
    Risultato = "il numero è pari !";
  }

  private void numeroDispari_ExecuteCode(object sender, EventArgs e)
  {
    Risultato = "il numero è dispari !";
  }
}

Il workflow che si è scelto come esempio, controlla se il parametro di ingresso è un numero pari (attraverso una IfElseActivity) e setta il risultato di questo controllo all'interno di due CodeActivity.

Così facendo, nell'event handler che gestisce l'evento WorkflowCompleted, possiamo accedere al valore di tali proprietà, mediante la collezione esposta dalla proprietà OutputParameters.

private static AutoResetEvent waitHandle = null;

static void Main(string[] args)
{
  using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
  {
    waitHandle = new AutoResetEvent(false);
    workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);        
      
    //...
  }
}

static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
  Console.WriteLine("Risultato: {0}", e.OutputParameters["Risultato"]);
  waitHandle.Set();
}

Questo è sicuramente un metodo molto veloce per farsi ritornare delle informazioni da un workflow (sia sequenziale che a stati), senza dover implementare da zero tutto il meccanismo di scambio di dati tra il flusso di lavoro e l'applicazione che funge da host.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi