In questo articolo di Dino spiega come far comunicare tra loro l'ambiente host e il runtime di Worflow Foundation.
L' articolo è un pò datato (ad esempio l'attributo [DataExchangeService] nella RTM è diventato [ExternalDataExchange]) ma comunque ottimo dal punto di vista didattico.
Stavo facendo qualche prova con una banalissima interfaccia IMyData
[ExternalDataExchange]
public interface IMyData {
event EventHandler NewDataAvailable;
void SendSomeData (string data);
string Data { get;set; }
}
e la relativa implementazione:
public class MyData:IMyData {
public event EventHandler NewDataAvailable;
private string mData;
public void SendSomeData (string data){...}
public void SendDataToWorkFlow (string data) {
if (NewDataAvailable != null) {
NewDataAvailable(this, new MyCustomDataEventArgs(ID, data));
}
}
}
quando scopro che l'invocazione di SendDataToWorkFlow() fallisce con errore: "Event NewDataAvailable cannot be delivered", analizzando l'InnerException scopro che il motivo è legato alla serializzazione degli argomenti e nello specifico del parametro sender che a quanto pare deve essere anch'esso serializzabile, infatti marcando con [Serializable] la classe MyData tutto si risolve.
Non essendo sempre possibile garantire la classe che implementa il contratto possa essere serializzabile, un alternativa diffusa pare essere quella di impostare il parametro sender a null.
public void SendDataToWorkFlow (string data) {
if (NewDataAvailable != null) {
NewDataAvailable(
null, new MyCustomDataEventArgs(ID, data));
}