Continua la nostra panoramica sul framework Microsoft per la creazione di workflow, con lo sviluppo di una Windows Form che faccia da host per il nostro workflow d’esempio.
Abbiamo gia detto infatti che un workflow deve essere "consumato" da una qualsiasi tipo di applicazione, sia Windows che web, che funga da host; ecco, nel caso delle Windows Form, tutto ciò risulta essere abbastanza facile, poiché queste presentano gia caratteristiche di persistenza; caratteristiche che sono fondamentali per il corretto funzionamento di ogni tipo di workflow.
Modifiche al workflow d'esempio
Prima di creare l'applicazione host, però, cambiamo il workflow che avevamo costruito per i precedenti esempi, giusto per non peccare troppo di banalità, inserendo un passo in più nella sequenza di attività.
Questo passo è rappresentato da una IfElseActivity. Questa attività consente al nostro workflow di seguire diverse strade a seconda del verificarsi o meno di una condizione; ogni strada è rappresentata anch'essa da un'attività di tipo IfElseBranchActivity, attività che può contenere n attività figlie.
Figura 1 - Il workflow d'esempio
La condizione, in base alla quale l’esecuzione del workflow viene deviata su un ramo al posto dell'altro, va inserita nel ramo in cui sono presenti i passi da eseguire nel caso in cui la nostra condizione venga soddisfatta.
I tipi di condizione supportati dall’attività IfElseBranchActivity sono due:- Code condition
- Declarative rule condition
Una Code condition non è altro che un event handler, che ritorna un valore booleano valorizzando la proprietà Result di un oggetto di tipo ConditionalEventArgs, passato come parametro.
protected void CheckUsername(object sender, ConditionalEventArgs e)
{
if (Username.ToLower() == "peppe")
e.Result = true;
else
e.Result = false;
}
Una Declarative rule condition, invece, è un tipo di regola dichiarativo che basta esplicitare scrivendo all’interno del "Condition Designer"; l'ide creerà un file .rules all'interno del nostro progetto, contenente le regole aggiunte, in formato XML. Sarà poi Workflow Foundation che valuterà questa regola a runtime.
figura 2 – Il "Condition Designer"
L'application host
Ora, aggiungiamo un nuovo progetto alla soluzione, e scegliamo il tipo "Windows Application".
Dopo aver inserito una textbox, un paio di label e un button all'interno della form, dobbiamo preoccuparci di due cose: in che punto dell'applicazione far partire il runtime di Workflow Foundation e in che punto stopparlo.
Nell'esempio ho scelto di far partire il runtime, solamente se questo non era stato ancora stato istanziato, al click su di un bottone. Una volta eseguita questa operazione, non dobbiamo far altro che passare i parametri al workflow, crearne una nuova istanza e farla partire attraverso la chiamata al suo metodo Start(). La cosa migliore da fare però, è istanziare il runtime direttamente all'interno del costruttore della form.
Da qui in poi, il controllo sull’esecuzione dell’applicazione passerà al workflow; questo valuterà il testo passato come parametro e prelevato dalla textbox, lo assegnerà alla proprietà Username ed eseguirà la Declarative rule condition definita precedentemente.
A questo punto, dobbiamo solamente stoppare il runtime di Windows Workflow Foundation. La cosa più logica, che ci viene offerta dalle windows form, è quella di eseguire questa operazione all'interno dell'event handler proprio dell'evento FormClosed.
Ma, vediamo il codice dell'applicazione:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using HelloWorkflow;
using System.Workflow;
using System.Workflow.Runtime;
namespace WinForm
{
public partial class Form1 : Form
{
#region Fields
private WorkflowRuntime runtime = null;
#endregion
#region Constructor
public Form1()
{
InitializeComponent();
}
#endregion
#region Start Wowkflow
private void btnStart_Click(object sender, EventArgs e)
{
if (null == runtime)
{
runtime = new WorkflowRuntime();
runtime.StartRuntime();
}
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("Username", txtUsername.Text);
Type t = typeof(Workflow1);
WorkflowInstance istance = runtime.CreateWorkflow(t, parameters);
istance.Start();
}
#endregion
#region Stop Runtime
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (runtime != null)
{
if (runtime.IsStarted)
runtime.StopRuntime();
}
}
#endregion
}
}
Il risultato, a seconda dell'input dato al workflow, sarà il seguente:
 |  |
Conclusioni
In questo articolo abbiamo potuto vedere la facilità con cui un workflow può essere consumato all'interno di una windows form, facilità dovuta a caratteristiche proprie delle form, prima fra tutte la persistenza dei dati. Gli sviluppi possibili sono chiaramente infiniti, considerando anche il fatto che l'applicazione d'esempio creata, in se per se, non effettua alcuna delle operazioni utili al corretto funzionamento del sistema; operazioni che invece vengono delegate ed eseguite dall’istanza del nostro workflow.
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
|
|
|