Valutare condizioni in un activity personalizzata di WF

di Cristian Civera, in Windows Workflow Foundation,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi