Si on regarde avec
reflector on note que la classe
XLANGPipelineManager dispose d'une fonction
static ExecuteSendPipeline qui permet d'invoquer par programmation le pipeline de sortie. Cette dernière prend en paramètre un élément de type
SendPipelineInputMessages c'est-à-dire un set de messages et retourne le message résultant du traitement du pipeline :
Pour pouvoir appeler les fonctions que nous venons de voir depuis notre orchestration il faut ajouter une référence à l'assembly
%WINDOWS%\assembly\GAC_MSIL\Microsoft.XLANGs.Pipeline\3.0.1.0__31bf3856ad364e35\Microsoft.XLANGs.Pipeline.dll dans notre projet :
Maintenant nous allons créer la variable
MessageToSend de type
SendPipelineInputMessages qui va accueillir les messages à agréger avant de les passer au pipeline de sortie :
Après l'étape d'invocation de la sous-orchestration, nous allons ajouter une étape qui consiste à positionner dans le contexte du message issu de la transformation
OutputMessage le nom du document source
Part dans la propriété
DecomposerMessageProperty (cellule en rouge dans le diagramme ci-dessous) :
Ceci permet lors de l'agrégation de remplacer dans le corps du message principal
InputBaseMessage le fragment
Part par
OutputMessage (pour mémoire dans le document principal
InputBaseMessage les emplacements à remplir sont identifiés par des Guid qui correspondent aux noms de parties).
Puis on ajoute le tout dans le message à donner en paramètre au pipeline de sortie :
MessageToAdd = OutputMessage;
MessageToAdd(PipelineComponentTester.DecomposerMessageProperty) = Part.Name;
MessageToSend.Add(MessageToAdd);
La dernière étape consiste à construire le message de sortie en appelant le pipeline que nous avons construit par programmation (cellule en jaune dans le diagramme ci-dessus) :
OutputMessage = null;
MessageToSend.Add(InputBaseMessage);
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(typeof(PipelineComponentTester.OutputPipeline),
MessageToSend, OutputMessage);
Dans cet extrait de code on ajoute au message à donner en paramètre au pipeline le message principal
InputBaseMessage puis on invoque la fonction d'appel qui retourne le résultat
OutputMessage.
Si lors de la compilation vous avez des erreurs de ce type il suffit d'ouvrir l'étape d'invocation au pipeline et de rajouter un espace au début de la section de code et de relancer la compilation et là tout rentre dans l'ordre (le point d'exclamation sur le designer reste dans tous les cas) :