WF dispone di molte activities di base che permettono di creare workflow differenti.
Puo' sorgere comunque la necessità di dover creare un propria activity custom da riutilizzare all'interno di tanti workflow.
La creazione di una activity custom è relativamente semplice e consiste nel creare una classe che derivi dalla classe Activity (da System.Workflow.ComponentModel):
public
partial class MyCustomActivity: System.Workflow.ComponentModel.Activity
{
public MyCustomActivity()
{
InitializeComponent();
}
} Una custom activity è una black-box che esegue una particolare attività e come tale ha bisogno di parametri di input, parametri di output e di un metodo di esecuzione.
I parametri devono essere esposti tramite proprietà pubbliche nel seguente modo:
public static DependencyProperty MyValueProperty = System.Workflow.ComponentModel.DependencyProperty.Register("MyValue", typeof(string), typeof(MyCustomActivity));
[
Browsable(true)]
[ValidationOption(ValidationOption.Optional)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public string MyValue
{
get { return ((string)(base.GetValue(MyCustomActivity.MyValueProperty ))); }
set { base.SetValue(MyCustomActivity.MyValueProperty , value); }
}
Il metodo in cui eseguire l'attività vera e propria è Execute:
protected
override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
return ActivityExecutionStatus.Closed;
} A questo punto l'activity è pronta per essere usata all'interno di un workflow.
Prendiamo per ipotesi che abbiamo creato un assembly contenente la custom activity e che abbiamo un altro assembly che contiene il workflow.
Quest'ultimo referenzia l'assembly dell'activity.
Quando andiamo ad utilizzare il designer per creare il workflow noteremo nella Toolbox di Visual Studio comparire anche la nostra custom activity, che possiamo trascinare ed utilizzare come le altre.
E' possibile mappare le proprietà pubbliche della custom activity con le proprietà pubbliche del workflow, questo per permettere per esempio che dati di input proveniente da chi ha invocato il workflow siano iniettati all'interno dell'activity stessa.
Per questo è sufficiente selezionare l'activity e nelle properties andare ad effettuare il mapping della proprietà dell'activity con una delle proprietà pubbliche del workflow.
Ricordo che nel code-behind del workflow è possibile creare proprietà pubbliche e che è possibile inizializzare tali proprietà all'atto della creazione del workflow tramite una collection dictionary generica:
...
Dictionary<string, object> parameters = new Dictionary<string,object>();
parameters.Add("Rda", rda);
WorkflowInstance wi = workflowRuntime.CreateWorkflow(workflowType, parameters);
...