Data Correlation

Il designer di WF4 non è in grado di effettuare la correlazione sfruttando proprietà degli oggetti padre nel caso in cui il messaggio passato all’activity Receive sfrutti l’ereditarietà. Inoltre viene settato solo il namespace del figlio, che non permette di accedere ai parametri del padre se quest’ultimo ha un namespace diverso.

Es: prendiamo in considerazione la seguente gerarchia di oggetti (ovvero DataContract)

image016


se all’oggetto Receive passiamo un messaggio (message) di tipo Rettangolo

image018


non riusciremo, tramite il designer, a settare correttamente una correlazione basata sul parametro Area del padre.

Per fare ciò bisogna passare alla modalità codice (View Code, F7), identificare il segmento xaml relativo alla Receive, e settare manualmente i parametri relativi all’XPathMessageQuery.

Il seguente esempio assume come namespace del padre: http://mydatacrontract e del figlio: http://mydatacontract/figure

<QueryCorrelationInitializer CorrelationHandle="[correlator]">

          <XPathMessageQuery x:Key="key1">

            <XPathMessageQuery.Namespaces>

              <ssx:XPathMessageContextMarkup>

                <x:String x:Key="xg0">http://mydatacrontract</x:String>

                <x:String x:Key="xg1"> http://mydatacrontract/figure</x:String>

              </ssx:XPathMessageContextMarkup>

            </XPathMessageQuery.Namespaces>sm:body()/xg1:Rettangolo/xg0:Area</XPathMessageQuery>

 </QueryCorrelationInitializer>

 

Nel caso in cui i namespace coincidano, avremo:

<QueryCorrelationInitializer CorrelationHandle="[correlator]">

          <XPathMessageQuery x:Key="key1">

            <XPathMessageQuery.Namespaces>

              <ssx:XPathMessageContextMarkup>

                <x:String x:Key="xg0">http://mydatacrontract</x:String>

              </ssx:XPathMessageContextMarkup>

            </XPathMessageQuery.Namespaces>sm:body()/xg0:Rettangolo/xg0:Area</XPathMessageQuery>

 </QueryCorrelationInitializer>

 

NB: [correlator] è l’handle di correlazione. 

Nel caso in cui l’ereditarietà è a più livelli (2+n), bisogna sempre considerare la classe utilizzata e quella in cui nativamente sono presenti i parametri su cui si fa la correlazione.

Correlazione in WF4

In WF4 esistono due tipologie di correlazione:

  • Content-Based is WF4 (nuova), dove l’identificatore dell’istanza (id di correalazione) è passato come parte del messaggio;
  • Context-Based Correlation, dove l’id di correlazione è parte del binding;

 

Content-Based is WF4

Supponiamo di avere due Activity Service nel nostro WF, il primo: GetData() ed il secondo: Add().

La sequenza di chiamate prevede l’invocazione iniziale di GetData() che ha la proprietà CanCreateInstance = true. L’istanza  è quendi creata e ci si attende di poter chiamare il service Add() su di essa.

Per fare ciò dobbiamo operare sia attraverso il Designer che direttamente dal codice.

 

Designer

Il primo passo è quello di creare una Variabile di tipo “CorrelationHandle”.

Selezionare, quindi, il tab Variables (in basso a sinistra del designer), specificarne il nome (in questo caso “correlator”) e settare il tipo a CorrelationHandle.

image001

Se si clicca sull’Activity Recive della primo service (GetData()) nella finestra delle proprietà è possibile vedere I seguenti attributi:

  • Correlates On
  • Correlates with
  • Correlation Initializes

image003

Prima di tutto bisogna inizializzare il correlation handle. Selezionando CorrelationInitializers, sempre sul primo Recive, si aprirà una finestra simile alla seuguente:

image005

Il primo _handle è impostato automaticamente dalla coppia Receive/SendResponse  e serve, appunto, a legare le due Activity. Creiamo un nuovo handler (“correlator”), selezioniamo “Query Correlation Initializer” ed impostiamo l’xpath relativo al parametro del messaggio che vogliamo utilizzare per effettuare la correlazione:

image007 

Nel caso in figura scegliamo OrderID, parte del messaggio OrderRequest. Accertarsi sempre che la proprietà “CanCreateInstance” della Recive sia settata a TRUE.

Selezioniamo la Recive successive (Add())

image010

La proprietà CanCreateInstance, questa volta, va settata a FALSE perchè vogliamo usare lo stesso workflow istanziato dal primo servizio. Scegliamo, tra le proprietà, CorrelatesWith e settiamo il valore indicato la variabile di correlazione precedentemente create “correlator”.

image012 

Ora bisogna specificare l’elemento su cui effettuare la correlazione.

Selezioniamo CorrelatesOn e selezioniamo l’elemento del messaggio che verrà confrontato con quello scelto per la correlazione. In figura si è ipotizzato che il messaggio sia di tipo ConfirmationRquest e che contenga l’elemento OrderId.

image014

Non è importate che il nome dell’elemento da confrontare sia uguale, ne che lo sia il mesaggio, l’importante è che uguale sia il loro valore.

 

Codice

Prima Receive: GetData()

  1. Creiamo un DataContact con due proprietà

[DataContract]

public class GetValues

 {

[DataMember]

public Guid CorrelationId { get; set; }

[DataMember]

public Int32 Value1 { get; set; }

[DataMember]

public Int32 Value2 { get; set; }

}

 

  1. Ora settiamo il tipo di messaggio all’interno della Recive legata al servizio GetValues (la prima). Settiamo CanCreateInstance a TRUE.

 

Seconda Receive: Add()

  1. Creiamo un DataContact per chiamare la Add()

[DataContract]

public class Add

{

[DataMember]

public Guid CorrelationId { get; set; }

}

 

  1. Definiamo il tipo di messaggio della seconda Recive, Add, sul datacontract appena creato. Inoltre settiamo CanCreateInstance a FALSE.

 

Inovochiamo il Workflow

Proxyclient client = new Proxyclient();

Guid correlationId = Guid.NewGuid();

 

GetValues startData = new GetValues();

startData.CorrelationId = correlationId;

startData.Value1 = 24;

startData.Value2 = 54;

bool? result = client.GetData(startData);

Add calladd = new Add();

calladd.CorrelationId = correlationId;

bool? result = client.Add(calladd);

Primo Post!

Salve a tutti.

Questo miniBlog vuole raccogliere una serie di opinioni/consigli tecnici frutto del lavoro quotidiano nell'ambito ICT. Comincerò con una serie di post su WF4, il framework per i sistemi long-runnig di .NET 4.

agileiot logo  ac2 logodac dac dacdac dac psmii psmii safe cal1 less certazure fundamentals
mvp reconnect

Free Joomla templates by Ltheme