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:
using System;
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.
public sealed class NextarPointsValidation : CodeActivity
{ public InArgument<Int32> NextarPointsCollected { get; set; } public OutArgument<Boolean> Approve { get; set; }
protected override void Execute(CodeActivityContext context)
{ Approve.Set(context, NextarPointsCollected.Get(context) >= 3000 ? true : false);
}
}
...
public sealed class NextarFuelValidation : CodeActivity
{ public InArgument<Int32> NextarFuel { get; set; } public OutArgument<Boolean> Approve { get; set; }
protected override void Execute(CodeActivityContext context)
{ Approve.Set(context, NextarFuel.Get(context) < 1500 ? true : false);
}
}
Nel progetto del primo workflow impostiamo il comportamento del servizio
WCF che lo esporrà; in questo caso i metadati saranno esposti
via HTTP:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>