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)
se all’oggetto Receive passiamo un messaggio (message) di tipo Rettangolo
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.