Dopo aver definito e disegnato un workflow, lo poniamo in esecuzione. Immaginiamo di aver creato un workflow che ci permette di prendere le prenotazioni per mandare un nostro pony express in giro per la città a fare consegne.
Il nostro workflow tiene conto dell'orario di arrivo della richiesta, quindi gira al pony l'elenco, in ordine di arrivo, degli indirizzi a cui recarsi. Se volessimo rendere più ottimizzato il workflow potremmo inserire uno step intermedio (activity) che mette in ordine di vicinanza/lontananza gli indirizzi e fornisce una stima del tempo di arrivo del pony al cliente.
Il workflow è in esecuzione, ma grazie alla classe WorkflowChanges possiamo aggiungere a runtime la nuova activity senza dover interrompere nulla.
InvokeWorkflowActivity newWorkflow = new InvokeWorkflowActivity();
WorkflowChanges changes = new WorkflowChanges(this);
Type type = typeof(ReservationWorkflow);
newWorkflow.Name = "NewReservationWF";
newWorkflow.TargetWorkflow = type;
DelayActivity delay = changes.TransientWorkflow.Activities["delay1"] as DelayActivity;
delay.Parent.Activities.Add(newWorkflow);
this.ApplyWorkflowChanges(changes);
Ci sono però delle restrizioni riguardo ai cambiamenti che possono essere compiuti su un workflow in esecuzione:
- Le activities possono essere aggiunte o rimosse da un WF ma le proprietà di una attività esistente (regole escluse) non possono essere modificate;
- Una activity composita non può avere al suo interno delle sotto-attività aggiunte o rimosse dinamicamente;
- Una activity con una o più istanze nello stato di Executing, Fault, Canceling o Compensating non può essere rimossa da una istanza di un workflow in esecuzione.
Nei prossimi post scruteremo, con il passare del tempo sempre più in dettaglio, le numerose features di questo nuovo 'framework nel framework'.