I workflow non vivono di vita propria ma devono comunicare con gli host a cui sono associati per scambiarsi informazioni riguardanti il flusso che stanno coordinando.
Il modo più semplice per far comunicare questi soggetti è il passaggio di parametri tramite una Dictionary generica che viene passata come parametro al metodo CreateWorkflow().
Questa Dictionary dovrà contenere come chiavi i nomi delle proprietà pubbliche esposte dalla classe workflow che vogliamo passare.
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("ParameterOne", "ValueOne");
parameters.Add("ParameterTwo", 2);
workflowInstance = workflowRuntime.CreateWorkflow(typeof(Semple.Workflow1), parameters);
instance.Start();
Viceversa se vogliamo ottenere delle informazioni dal workflow possiamo utilizzare la proprietà OutputParameters della classe WorkflowCompletedEventArgs legato all'evento WorkflowCompleted.
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
{
string result = (string)e.OutputParameters["ParameterOne"];
Console.WriteLine(result);
waitHandle.Set();
};
Un altro metodo prevede di utilizzare delle interfacce per comunicare, anche se è un po' più complesso ci consente di avere più flessibilità e di creare una architettura tipizzata.
Se ad vogliamo che l'host comunichi con il workflow dobbiamo creare un interfaccia decorandola con l'attributo ExternalDataExchange, definire al suo interno un evento che presenta un EventArgs che andremo a personalizzare inserendo le proprietà che ci interessano e facendolo derivare dalla classe ExternalDataEventArgs.
Questo EventArgs dovrà essere serializzabile per permetterne la persistenza.
[ExternalDataExchange]
public interface ICommunicationService
{
event EventHandler<InformationSelectedEventArgs> AccountSelected;
void ActionForHost();
}
[Serializable]
public class InformationSelectedEventArgs : ExternalDataEventArgs
{
private String information;
public String Information
{
get { return (this.information); }
set { this.information = value; }
}
public InformationSelectedEventArgs(Guid instanceId, String information)
: base(instanceId)
{
this.information = information;
}
}
Una volta creata questa struttura andremo ad inserire nel workflow una activity di tipo HandleExternalEventActivity a cui associamo l'interfaccia appena creata e il metodo da richiamare.
A questo punto è sufficiente implementare l'interfaccia all'interno dell'host.
public event EventHandler<InformationSelectedEventArgs> InformationSelected;
protected virtual void OnInformationSelected(InformationSelectedEventArgs args)
{
if (InformationSelected != null)
InformationSelected(null, args);
}