Nella creazione di flussi sequenziali per Windows Workflow Foundation è frequente la creazione di Activity personalizzate per eseguire semplici operazioni che non sono presenti nel framework o che semplicemente presentano esigenze particolari.
In un flusso è fondamentale valutare condizioni e in questo IfElseActivity può bastare in molte situazioni, ma se in un Activity personalizzata si ritiene di poter inglobare una variazione di comportamento in determinate condizioni, è possibile utilizzare la classe ActivityCondition e valutarla in fase di esecuzione.
Per utilizzarla occorre definire una DependencyProperty sulla classe e una proprietà wrapper nel canonico modo di dichiarazione delle proprietà sulle Activity:
public partial class MyActivity: Activity { public static readonly DependencyProperty ConditionProperty = DependencyProperty.Register("Condition", typeof(System.Workflow.ComponentModel.ActivityCondition), typeof(MyActivity)); [DefaultValue(null)] public System.Workflow.ComponentModel.ActivityCondition Condition { get { return (System.Workflow.ComponentModel.ActivityCondition)this.GetValue(ConditionProperty); } set { this.SetValue(ConditionProperty, value);} } }
Definita la proprietà, questa risulta visibile in fase di design ed è possibile assegnare due tipi di condition:
- CodeCondition: rappresenta una condizione che scatena un evento nel quale viene eseguito codice liberamente scritto dal disegnatore del Workflow;
- RuleConditionReference: rappresenta una condizione caricata da file XML con estensione .rules. La condizione è un'espressione System.CodeDom serializzata.
Indipendentemente dal tipo di condizione, la classe ActivityCondition permette con il metodo Evaluate di valutarla e ottenere un booleano. Il metodo Execute dell'Activity è il punto ideale per fare ciò ed eseguire codice in funzione del risultato:
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (this.Condition != null) { // Valuto la condizione bool result = this.Condition.Evaluate(this, executionContext); if (result) { // Faccio qualcosa } } return ActivityExecutionStatus.Closed; }
Il primo parametro indica qual è l'Activity e quindi il Workflow sul quale eseguire la valutazione, mentre il secondo permette di ottenere i servizi del WorkflowRuntime e di debugging.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.