DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

[Windows Workflow Foundation] Modificare un Workflow a run-time

Un' interessante possibilità che ci viene offerta da Workflow Foundation riguarda il cambiamento dinamico a run-time dell'albero delle attività di un' istanza di un workflow. In realtà, escludendo scenari particolari che richiedono una certa flessibilità nella composizione di un workflow, non ritengo che questa costituisca una prassi così consigliabile, considerando ad esempio i ritardi di esecuzione oppure i possibili ulteriori problemi che potrebbero affliggere il runtime a seguito di modifiche dinamiche in fase di esecuzione.
Ad ogni modo, WWF ci permette di aggiornare dinamicamente un'istanza di workflow in termini di aggiunta/rimozione attività (anche custom), cambiamento del flow control, aggiornamento della logica condizionale (If-Else) , ma soprattutto in termini di gestione di nuovi eventi.
All'atto pratico ci sono due modi per apportare modifiche ad un' istanza di un workflow in esecuzione: all'interno della logica del workflow stesso, oppure all'interno della logica dell'applicazione host. E' evidente che dal punto di vista del runtime, le modifiche interesseranno solo ed esclusivamente una precisa istanza di un workflow, dal momento che altre istanze potrebbero essere in esecuzione e non interessate al cambiamento previsto. Ciò significa che quando la nostra istanza di workflow raggiungerà lo stato Completed, i nostri cambiamenti 'moriranno' con essa poiché non coinvolgono la definizione originale del workflow.

Cambiamenti all'interno dell'istanza di workflow

Prima domanda: "Dove inseriamo il nostro codice che modifica il comportamento del workflow?" Risposta: tipicamente all'interno di un event handler di una attività (anche custom) del workflow stesso, ma preferibilmente ovunque il workflow si trovi in uno stato Suspended o Idled (ricordiamoci che stiamo lavorando su un' istanza in esecuzione).
Vediamo un semplice esempio: abbiamo un SampleWorkflow (che deriva dal solito SequentialWorkflowActivity - ovvero una rappresentazione di un workflow che esegue delle attività sequenzialmente) in cui vogliamo aggiungere un' attività custom SumActivity che dietro le quinte non fa altro che sommare due interi A e B esposti come proprietà.
Possiamo inserire questo 'cambiamento' all'interno della logica di una CodeActivity già definita a livello di workflow:

public class SampleWorkflow : SequentialWorkflowActivity
{ 
  private void codeActivity_ExecuteCode(object sender, EventArgs e)
 
{
   ...

  
CustomActivityLibrary.SumActivity sumActivity = new CustomActivityLibrary.SumActivity();
   WorkflowChanges changes = new WorkflowChanges(this);      
   sumActivity.A = 2;
   sumActivity.B = 4;         
   changes.TransientWorkflow.Activities.Add(sumActivity);
   changes.Validate();
   this.ApplyWorkflowChanges(changes);

   ...
  }
}

Osserviamo immediatamente l'utilizzo della classe WorkflowChanges, che espone la proprietà TransientWorkflow, ovvero una clonazione dell'albero delle attività dell'istanza del workflow corrente a cui applicare i cambiamenti, che in seguito verranno propagati alla corretta istanza del workflow (lasciando le altre istanze immutate). Il metodo Validate si occupa di controllare preventivamente la semantica dei cambiamenti e quindi che non si verifichino potenziali eccezioni. Infine, tramite il metodo ApplyWorkflowChanges applichiamo i cambiamenti implementati direttamente sull'istanza del workflow in esecuzione.

Cambiamenti all'interno dell'applicazione Host
Diversamente dal caso precedente, i cambiamenti su un' istanza di un workflow vengono effettuati a partire dall'applicazione host, sfruttando le API messe a disposizione da WWF. Osservando il seguente esempio, si nota subito come l'unica differenza si trovi nel modo con cui andiamo a reperire l'istanza sui cui andare ad apportare le nostre personalizzazioni: in questo caso infatti un'istanza di workflow viene creata tramite il metodo CreateWorkflow del runtime e tramite il metodo GetWorkflowDefinition() non facciamo altro che puntare alla relativa attività root. Il codice dunque non fa altro che 'appendere' semplicemente la nostra SumActivity all'albero delle attività così come definito in SampleWorkflow.

using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
  ...

 
WorkflowInstance workflow_instance = workflowRuntime.CreateWorkflow(typeof(SampleWorkflow));               
  WorkflowChanges changes = new WorkflowChanges(workflow_instance.GetWorkflowDefinition());
  CustomActivityLibrary.SumActivity sumActivity = new CustomActivityLibrary.SumActivity();
  sumActivity.A = 2;
  sumActivity.B = 4;
  changes.TransientWorkflow.Activities.Add(sumActivity);
  changes.Validate();
  workflow_instance.ApplyWorkflowChanges(changes);

  ...
}


Technorati tags:  Workflow  WWF

Print | posted on giovedì 15 maggio 2008 02:30 | Filed Under [ WWF ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET