Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Comunicazioni in WF 4.0: async comm (1/7)
Scritto da Fabio Carucci il 26-10-2010 ore 09:51
Intel Parallel Studio XE
Grazie alle feature disponibili in Windows Communication Foundation (WCF) è possibile realizzare mediante Windows Workflow Foundation 4.0 (WF) workflow indipendenti, ed esporli come servizi WCF; la comunicazione e lo scambio di messaggi tra questi può avvenire quindi in modalità asincrona.

Le activity che permettono quanto suddetto contengono logica prestata da WCF: Receive, ReceiveAndSendReply, Send, SendAndReceiveReply, TransactedReceiveScope, CorrelationScope e InitializeCorrelation.

Le prime due activity si utilizzano per ricevere messaggi da WCF e spedire risposte; Send e SendAndReceiveReply trasmettono messaggi e ricevono risposte; le ultime tre rispettivamente inseriscono il workflow in una transazione, gestiscono la correlazione tra messaggi figli e ne inizializzano l'attività.

L'esempio mostrato in questo articolo fa uso di alcune activity tra le suddette, e consiste nella simulazione di un sistema che attribuisce l'assegnazione di un premio al possessore di una card chiamata Nextar (nome fittizio) sulla base di due parametri: un numero di punti collezionato, oppure una quantità di litri di benzina acquistati nel tempo; sul piano tecnico vi è un workflow che riceve il numero di punti e i litri di benzina e li espone tramite una interfaccia WCF; un secondo workflow riceve la richiesta di attribuzione del premio e interroga il primo, in maniera del tutto asincrona, per decidere se assegnare o meno il premio al giocatore; infine una applicazione client interroga il secondo workflow per conoscere l'esito del gioco (il codice è basato su esempi presenti su MSDN)

I namespace da utilizzare per gli esempi di codice mostrati in questa prima parte sono i seguenti:
  1. using System;
  2. using System.Activities;
Le classi seguenti derivano da CodeActivity e rappresentano due activity, che verranno in seguito inserite nel workflow per validare i punti o i litri di benzina collezionati dal giocatore.
  1. public sealed class NextarPointsValidation : CodeActivity
  2.     {
  3.         public InArgument<Int32> NextarPointsCollected { get; set; }
  4.         public OutArgument<Boolean> Approve { get; set; }
  5.  
  6.         protected override void Execute(CodeActivityContext context)
  7.         {          
  8.             Approve.Set(context, NextarPointsCollected.Get(context) >= 3000 ? true : false);
  9.         }
  10.     }	
  11. ...
  12. public sealed class NextarFuelValidation : CodeActivity
  13.     {
  14.         public InArgument<Int32> NextarFuel { get; set; }
  15.         public OutArgument<Boolean> Approve { get; set; }
  16.  
  17.         protected override void Execute(CodeActivityContext context)
  18.         {            
  19.             Approve.Set(context, NextarFuel.Get(context) < 1500 ? true : false);
  20.         }
  21.     }
Nel progetto del primo workflow impostiamo il comportamento del servizio WCF che lo esporrà; in questo caso i metadati saranno esposti via HTTP:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <system.web>
  4.     <compilation debug="true" targetFramework="4.0" />
  5.   </system.web>
  6.   <system.serviceModel>
  7.     <behaviors>
  8.       <serviceBehaviors>
  9.         <behavior>
  10.           <serviceMetadata httpGetEnabled="True"/>
  11.         </behavior>
  12.       </serviceBehaviors>
  13.     </behaviors>
  14.   </system.serviceModel>
  15. </configuration>
Precedente: Quando l'istruzione SQL UPDATE fallisce: tre possibili ragioni
Successiva: Come realizzare un oscilloscopio per cellulari Android
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.305 secondi.