Passaggio di parametri ad un Workflow
Data: 9/8/2006
Categoria: Workflow Foundation
Codice d'esempio


Nel primo articolo dedicato a Windows Workflow Foundation abbiamo fatto una breve panoramica sul prodotto, sul concetto di workflow e abbiamo visto un semplice esempio di base per la creazione di un sequential workflow.
Oggi, vedremo come passare delle informazioni ad un workflow quando questo viene istanziato.
Per effettuare questa operazione, esistono due modi: attraverso l'utilizzo di parametri oppure attraverso lo scatenarsi di eventi.
I parametri sono delle proprietà della classe che rappresenta il workflow, che potranno quindi essere utilizzate sia dalle attività presenti nel workflow che dall'applicazione host.
Per utilizzare gli eventi, invece, è necessario creare un'attività custom che faccia da fonte di dati esterna e che passi informazioni all'interno del workflow.
Nell’articolo di oggi, ci soffermeremo solamente sull’uso dei parametri.

Abbiamo detto che per aggiungere dei parametri, basta inserire delle rispettive proprietà nella classe che rappresenta il workflow; quindi, riprendendo quella del nostro primo esempio, questa diventerà:

workflow1.cs
public sealed partial class Workflow1 : SequentialWorkflowActivity

{
private string username;

public string Username
{
get { return username; }
set { username = value; }
}

public Workflow1()
{
InitializeComponent();
}

private void helloWorldCodeActivity_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("\nHello {0} !", Username);
}
}

Come potete vedere, abbiamo inserito una proprietà (Username) che viene utilizzata dalla code activity "helloWorkflowCodeActivity".
Ora, quando il workflow viene istanziato, le proprietà che fanno da parametri, vanno riempite di informazioni. Come fare ?
Semplice. Uno degli overload del metodo CreateWorkflow (metodo che serve a ritornare un istanza del workflow da far eseguire) oltre al tipo di workflow, prevede anche un oggetto generico di tipo Dictionary<string, object>. Ecco, questo oggetto conterrà tutte le coppie chiave-valore utili per il passaggio di dati alle proprietà del workflow, dove la chiave di ogni coppia sarà il nome della proprietà da valorizzare.

Nota: C# è un linguaggio case-sensitive, quindi la stringa chiave, deve rispettare esattamente le minuscole e le maiuscole della proprietà che vuole valorizzare.

program.cs
class Program

{
static void Main(string[] args)
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted +=
delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated +=
delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};

Console.Write("Insert your name: ");

Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("Username", Console.ReadLine());

Type t = typeof(HelloWorkflow.Workflow1);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(t, parameters);
instance.Start();

waitHandle.WaitOne();

Console.WriteLine("\n\n");
Console.WriteLine("Press any key to exit ...");
Console.Read();
}
}
}

Il risultato sarà questo:

Esecuzione del programma
Figura 1 – esecuzione del programma


Link utili:
WF home page
WF on msdn
Workflow Foundation Beta 2.2
Microsoft Visual Studio 2005 Extensions for Windows Workflow Foundation Beta 2.2