Introduzione a Workflow Foundation
-
Upload
dotnetmarche -
Category
Technology
-
view
177 -
download
3
description
Transcript of Introduzione a Workflow Foundation
![Page 1: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/1.jpg)
Q&A
![Page 2: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/2.jpg)
Workflow Foundation
Email: [email protected]: http://blogs.ugidotnet.org/raffaele
MVP Profile: http://mvp.support.microsoft.com/profile/raffaele
Visual Developer Security MVPRaffaele Rialdi, Vevy Europe
![Page 3: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/3.jpg)
Cos'è Worklow Foundation
![Page 4: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/4.jpg)
Risposta istituzionale
• Una delle quattro tecnologie che formano il fx 3.0– WPF, WCF, WF, Cardspace
• Una infrastruttura per modellare la logica di business di una applicazione
• Una tecnologia che permette di gestire un processo secondo un flusso sequenziale (workflow) oppure una macchina a stati (state machine)
• È managed!
![Page 5: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/5.jpg)
Risposta tecnologica
Workflow Foundationè un DSL
10 Print "Hello, world"
HW db 'Hello, world', 0dh, 0ah, 0...mov ah,9mov dx, HWint 21h
class MyApp { static void Main(){ Console.WriteLine("Hello, world"); }}
DSLDomainSpecificLanguage
GPLGenericProgrammingLanguage
![Page 6: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/6.jpg)
I concetti base di Workflow Foundation
• Le istruzioni di questo linguaggio si chiamano Activities• Le Activities sono classi
– Si possono creare custom Activities da zero, per inheritance o composition
• Le Activities sono soggette a diverse validazioni– logica (email) e/o funzionale (collocazione)
• Alle Activities sono abbinabili una UI, un designer e un tema
• Le Activities condizionali valutano delle regole definite nel sistema
![Page 7: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/7.jpg)
Due domini di lavoro preconfezionati di Workflow Foundation
• Workflow sequenziale e Macchine a stati– Logica differente, designer differente– Sono loro stessi delle Activities (composite)
• Workflow sequenziale– rappresenta una sequenza di istruzioni, cicli e condizioni– non è un flowchart classico, non prevede "goto"– designer abbastanza intuitivo
• Macchine a stati– rappresenta la logica che esplicita i possibili stati di un
problema ed il modo in cui avviene la transizione tra gli stati
![Page 8: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/8.jpg)
Sveliamo la fine?
![Page 9: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/9.jpg)
Una possibile architettura
ClientTest(Winform)
ConsoleServiceHost(Console)
SubscriptionService(WCF Service)
SubscriptionWorkflowLibrary(Workflow)
ExternalDataExchange
WindowsService
IISworker process
Asp.netWebApp
WPFClient
Proxy WSDL
![Page 10: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/10.jpg)
Come si usa WF?
![Page 11: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/11.jpg)
Usare Workflow Foundation
• I Workflow hanno bisogno di uno speciale runtime per lavorare
• Scegliere il Processo/AppDomain che hosta il runtime e istanziarlo
• Creare il workflow desiderato• Aggiungere al Runtime i servizi necessari (0+)
– funzionalità addizionali di Workflow• Avviare una o più istanze di workflow• Gestire l'evento di termine del workflow
– opzionale
![Page 12: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/12.jpg)
Applicazione host
Architettura
ActivitiesStructured
Activity Framework
Workflow Runtime
Runtime Services
CustomActivities
Visual Studio Workflow Designer Custom Designers
State Machine Rules
Loader Persistence Threads Transactions Tracking
Validation
Transactions
Compilation Serialization Visualization
Fault Handling Cancellation Compensation
Scheduling Instance Mgmt
…
![Page 13: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/13.jpg)
Workflow Foundation e Visual Studio
08/04/2023 www.xedotnet.org 13
![Page 14: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/14.jpg)
Gli strumenti forniti da WF
• Un runtime engine– gestisce l'esecuzione, lo stato, il tracking, le update
• I servizi di base– la comunicazione, la persistenza, il tracking, lo scheduling, le transazioni, ...
• Una API managed– permette al developer di interagire con l'engine e i servizi
• Una libreria di Activity base– Classi di Activity usabili "as is" oppure espandibili via ereditarietà o
composition• Un designer integrato con VS2005
– Ogni azione sul designer ha una corrispondente porizione di codice o di markup dichiarativi
• Un debugger integrato con VS2005– Step-by-step debugging sul disegno del workflow
![Page 15: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/15.jpg)
Due modi per scrivere un Workflow
• Descritti in codice– Normali classi derivate da
SequentialWorkflowActivity oppure da StateMachineWorkflowActivity
– Default per il wizard di VS2005– Usa una partial class di C#2.0 / VB.net 2.0
• Espressi in XML– Usano il nuovo XAML– Si aggiunge con Add – New Item di VS2005
![Page 16: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/16.jpg)
XAML e WF
• XAML non è WPF– Esistono diversi formati di XAML:
WPF, WF, XPS, Silverlight, ... ognuno il suo!
• XAML è un linguaggio che permette di rappresentare un grafo di oggetti– I tag XML di XAML sono il risultato della serializzazione degli
oggetti in memoria
• WF usa l’estensione XOML ma il linguaggio è lo stesso
![Page 17: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/17.jpg)
Dependency Properties e Binding
• WF usa in modo estensivo le Dependency Properties– Crea una proprietà statica– La associa alle istanze in un Dictionary statico
• Vantaggi:– Notifica automatica al cambio di valore (ai subscribers)– Binding via ActivityBind– Default values– …
public string Name{
get { return (string)GetValue(NameProperty); }set { SetValue(NameProperty, value); }
}
public static readonly DependencyProperty NameProperty =DependencyProperty.Register("Name", typeof(string), typeof(Add));
![Page 18: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/18.jpg)
Markup e Code Workflow
.NET assembly• ctor definisce
il workflow
Solo Markup“Dichiarativo”
XAML
Mix di Markupe Codice
C#/VB
Solo Codice ApplicationGenerated
XAML C#/VB
XML definiscela struttura logicadel workflow eil flusso di dati
XML definisce ilWorkflowCode-beside la logica restante
Codice crea ilworkflownel costruttore XAML C#/
VB
App crea le Activity
e le serializza
Compilatore Workflowwfc.exe
Compilatore C#/VB
![Page 19: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/19.jpg)
Quando conviene il modello dichiarativo?
• Vantaggi– è xml e quindi modificabile a runtime– è xml e quindi persistibile come risorsa
• dentro un db, in un file, etc.
• Svantaggi– nel file xoml niente dichiarazione di proprietà– nel file xoml niente codice– si risolve usando una partial class (code beside)
![Page 20: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/20.jpg)
Quando conviene il modello dichiarativo?
• Vantaggi– può comunque essere usato con il 'code beside'– è xml e quindi modificabile a runtime– è xml e quindi persistibile come risorsa, dentro un db, in un file, etc.– WorkflowRuntime.CreateWorkflow(XmlReader) salta lo step di
compilazione. La serializzazione di questo risultato è l'unico che comprende l'intero workflow (children compresi)
• Esempio SerializeWF
• Svantaggi– non permette la dichiarazione di proprietà nel file xoml– non permette di scrivere / associare codice dentro il file xoml– in entrambi i casi è possibile risolvere usando una partial class
![Page 21: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/21.jpg)
Workflow sequenziale
• Tramite designer (opzionale) si definisce una sequenza di Activities– Questo passo definisce una nuova classe che rappresenta il workflow
vero e proprio
• Si istanzia il runtime di WF– WorkflowRuntime workflowRuntime = new WorkflowRuntime();
• Si istanzia e si esegue il workflow– WorkflowInstance instance1 =
workflowRuntime.CreateWorkflow( typeof(PersistenzaXoml.Workflow1));
– instance1.Start();
![Page 22: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/22.jpg)
SimpleBinding: dependency property, debugger
![Page 23: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/23.jpg)
Workflow come blackbox
WorkflowRuntime wr = new WorkflowRuntime();wr.StartRuntime();
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("FirstName", txtFirstName.Text);parameters.Add("LastName", txtLastName.Text);
WorkflowInstance instance = wr.CreateWorkflow( typeof(MyWF.Workflow1), parameters);
instance.Start();
Parametri in ingresso Parametri in uscita
wr.WorkflowCompleted += OnWfCompleted;
// ...
static void OnWfCompleted(object sender, WorkflowCompletedEventArgs e){ string Status = e.OutputParameters["Status"] as string;
Console.WriteLine("Status is " + Status);}
(prima dell'esecuzione) (al termine dell'esecuzione)
Workflow
Elenco di tutte le proprietàesposte dal nostro workflow
![Page 24: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/24.jpg)
Punti di attenzione
• Il runtime / workflow condividono lo stesso AppDomain dell'applicazione– Un solo runtime per AppDomain
• Con lo scheduler di default ogni istanza di workflow gira in un thread a se stante– necessario per rispettare i tempi e gli eventi definiti nel workflow– complica la comunicazione e la sincronia con l'applicazione host
• Con lo scheduler Manuale gira tutto nel thread da cui è stato instanziato il runtime– ManualWorkflowSchedulerService
• I parametri di ingresso e uscita al workflow sono sempre passati come object
![Page 25: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/25.jpg)
I principali servizi di WF
![Page 26: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/26.jpg)
Workflow e servizi
• I servizi di WF sono pluggabili– questa architettura permette l'espandibilità futura dell'infrastruttura di
Workflow• Alcuni esempi:
– ExternalDataExchangeService (comunicazione tra host e workflow)– WorkflowSchedulerService (scheduler di default)– ManualWorkflowSchedulerService (scheduler su singolo thread)– WorkflowPersistenceService– TrackingService– WorkflowTransactionService– Custom (derivato da WorkflowRuntimeService)– WorkflowCompilerOptionsService– ToolboxService– ......
![Page 27: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/27.jpg)
Persistenza - SqlWorkflowPersistenceService
• Il runtime può scaricare dalla memoria i workflow– in automatico
• sull'evento di Idle entrando in una Delay Activity• al completamento di ActivityExectionContext• al completamento di TransactionScopeActivity• al completamento di una Activity decorata con PersistOnClose
– in manuale, chiamando Unload (blocking) o TryUnload (non blocking)
• I workflow vengono ricaricati in memoria– in automatico, anche come conseguenza di un timer (Delay Activity)– in manuale, chiamando Load o runtime.GetWorkflow(InstanceId)
• Lo stato di persistenza è consistente– È possibile riattivare un workflow anche da un processo differente– È resistente ad un crash/recycle del processo
![Page 28: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/28.jpg)
Persistenza - SqlWorkflowPersistenceService
• Creare un db (o selezionarne uno già pronto)• Eseguire gli script
– C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN
• Aggiungere il servizio
WorkflowRuntime runtime = new WorkflowRuntime();
NameValueCollection pars = new NameValueCollection();pars.Add("connectionString", ConnectionString);pars.Add("unloadOnIdle", "true");
SqlWorkflowPersistenceService SqlPersistence = new SqlWorkflowPersistenceService(pars);
runtime.AddService(SqlPersistence);
![Page 29: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/29.jpg)
Persistenza
![Page 30: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/30.jpg)
Tracking service
• Permette di registare una sorta di LOG su ciò che accade nell'istanza del nostro workflow– creazione, idle, custom, ...
• Si possono aggiungere annotazioni al log• Si possono eliminare informazioni indesiderate
– TrackingProfile• L'esempio WorkflowMonitor dell'SDK funge da
viewer su qualsiasi workflow leggendo il DB
![Page 31: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/31.jpg)
Tracking - SqlTrackingService
• Creare un db (o selezionarne uno già pronto)• Eseguire gli script
– C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN
• Aggiungere il servizio
WorkflowRuntime runtime = new WorkflowRuntime();
SqlTrackingService tracking = new SqlTrackingService(CnnStr);
runtime.AddService(tracking);
![Page 32: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/32.jpg)
Tracking – leggere le informazioni
• Non c'è bisogno di fare query sul DB– WF espone un object model!!!
SqlTrackingQuery track = new SqlTrackingQuery(CnnString);SqlTrackingWorkflowInstance WfInstance = null;track.TryGetWorkflow(instanceId, out WfInstance);// ...foreach (ActivityTrackingRecord atr in WfInstance.ActivityEvents){
Console.WriteLine("Status: {0}", atr.ExecutionStatus);Console.WriteLine("Date: {0}", atr.EventDateTime);Console.WriteLine("Name: {0}", atr.QualifiedName);
}// ...
Disp. anche...WorkflowEvents
OppureGetWorkflows(...)
![Page 33: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/33.jpg)
Tracking - Eventi utente
• La classe Activity espone il metodo TrackData• La stringa/blob viene registrata nella tabella
UserEvent• SqlTrackingWorkflowInstance espone anche la
proprietà UserEvents per recuperare queste informazioni
![Page 34: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/34.jpg)
Tracking – Manutenzione DB
• Il DB non è di dimensione infinita
• Sistema 1– Ricreare il DB ... decisamente drastico
• Sistema 2– Partitioning delle informazioni:
• http://blogs.msdn.com/moustafa/archive/2006/03/23/559391.aspx• http://msdn2.microsoft.com/en-us/library/aa349365.aspx
![Page 35: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/35.jpg)
Tracking
![Page 36: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/36.jpg)
ExternalDataExchangeService: Interattività tra workflow e host
Thread 1 Thread 2
ExternalDataExchangeService ds = newExternalDataExchangeService();
_Runtime.AddService(ds);
MyService svc = new MyService();
// informiamo WF del nostro serviziods.AddService(svc);
public class MyService : IMyService
ExternalDataExchangeService è un contenitore dei servizi di comunicazione
![Page 37: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/37.jpg)
Comunicazione con ExternalDataExchangeService
![Page 38: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/38.jpg)
ExternalDataExchangeService: Interattività tra workflow e host
1. Definire una Interfaccia e marcarla con [ExternalDataExchange]– Dichiarare gli eventi per comunicare verso WF
event EventHandler<MyEventArgs> Foo;– Dichiarare metodi per comunicare verso l'host
void FromWorkflow(string Message);
2. Implementare l'interfaccia in una classe– la UI va aggiornata via Invoke
3. Scrivere una classe (marcata con Serializable) che deriva da ExternalDataEventArgs per passare dei parametri
4. Gestire nel workflow i messaggi in ingresso conHandleExternalEventActivity
5. Spedire messaggi verso l'host con CallExternalMethodActivity
6. Nel caso di invocazione parallela di eventi, i parametri possono essere correlati tra loro tramite l'attributo CorrelationParameter
![Page 39: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/39.jpg)
Le Activity
![Page 40: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/40.jpg)
Le Activity
• Sono il "mattoncino" base di WF– System.Workflow.ComponentModel.Activity
• Ci sono tre tipologie di Activity– Basic: semplici nodi di un programma
• SendMail, call WebService, etc. etc.– Composite: contenitori che consentono di
modellare e coordinare le activity base• SequentialActivity. ParallelActivity, ...
– Root: Activity speciali che costituiscono una unità di attivazione
• Microsoft ne fornisce due:– SequentialWorkflowActivity– StateMachineWorkflowActivity
![Page 41: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/41.jpg)
Nozioni base sulle Activity
• Le Activity sono classi:– Proprietà ed eventi sono definite dal suo autore e
programmabili dai workflow che le usano– Espongono metodi that are scritti dal suo autore
ma invocati dal workflow runtime (per esempio 'Execute') o dal designer
– Possono far parte dello stesso assembly in cui è definito il workflow oppure (meglio) redistribuite in assembly a se stanti e riutilizzabili
• Per esempio la code activity …
![Page 42: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/42.jpg)
CAG: Conditioned Activity Group
• Esegue un loop per tutte le Activitycontenute fino a che la UntilConditiondella CAG vale true (con true, termina)
• Ciascuna Activity contenuta riceve una nuova WhenCondition– Se la WhenCondition è usata, l'Activity sarà
eseguita ogni volta che questa vale true– Se non c'è WhenCondition, l'Activity sarà
eseguita solo una volta
• Se non viene specificata una UntilCondition, la CAG termina quando tutte le Activity valutano a false la loro WhenCondition
![Page 43: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/43.jpg)
Replicator Activity
• Esegue n istanze delle Activitycontenute fino a che la UntilConditionvale true (con true, termina)
• Se la UntilCondition viene omessa, leActivity vengono eseguite una volta
• L'esecuzione può essere seriale o parallela (ExecutionType)– Dentro ChildInitialize si popola la collection che determina il numero di
istanze che il replicator creerà– ChildCompleted viene chiamato a conclusione di ciascuna istanza– Completed viene eseguito al termine di tutte le istanze
![Page 44: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/44.jpg)
Gli errori
![Page 45: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/45.jpg)
Tipologie di errori
• Tramite la ThrowActivity• Fallimento di una transazione
– timeout di una transazione atomica– fallimento correlato alla transazione stessa
• Eccezione nel code-beside• Eccezione dell'infrastruttura
– Servizi di persistenza, collegamento con un db– Eccezione di sistema di dotnet
![Page 46: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/46.jpg)
Gestire le eccezioni
• FaultHandlerActivity– Corrisponde allo statement “catch” – Una FaultHandlerActivity per ogni tipo di eccezione
da gestire– Permette di eseguire una sequenza di Activity
• CancellationHandlerActivity – Corrisponde allo statement “finally”
![Page 47: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/47.jpg)
Rules
![Page 48: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/48.jpg)
Le "Rules" (regole)
• Le regole in WF– Permettono di modellare più facilmente la logica– Rendono più semplice la comprensione della
logica del sistema– Permettono di eseguire modifiche in modo
semplice e comprensibile– Sono serializzate in XML
• È possibile cambiare le regole a runtime
![Page 49: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/49.jpg)
Rule / Ruleset editor
![Page 50: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/50.jpg)
RuleSet
• Due dialog usabili anche fuori da WF:– RuleSetDialog– RuleConditionDialog
• Sono in preparazione Dialog ancora più specializzate– Ad esempio BizTalk ha un suo custom editor
![Page 51: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/51.jpg)
Policy Activity
• Applica le regole definite in un RuleSet– Il RuleSet è una collection di regole (Rule)– Logica: If <condizione> Then <Azione1> Else <Azione2>– Ogni Rule ha una priorità (positive o negative).
La più alta viene eseguita per prima. Il default è zero.• Ogni Azione
– può impostare una proprietà, un membro o chiamare un metodo– eseguire un Halt (fermare la policy) o un Update (rivalutare le espressioni)
• Ogni regola– può essere attivata / disattivata (proprietà Active)– ha una proprietà ReevaluationBehavior (che vale Always o Never) che determina
se la regola può essere rivalutata (la regola precedente può aver modificato un membro che fa parte della condizione di questa regola)
– Il Chaining determina la politica di rivalutazione delle condizioni delle regole. Ad esempio Full Chaining implica l'autorivalutazione.
![Page 52: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/52.jpg)
Activity base di "regole"• IfElse: branch classico if/else• While: esegue un loop• Replicator: esegue più volte una stessa Activity• CAG: Condition Activity Group. Esegue delle Activity in modo
condizionale• Policy: esegue delle 'azioni' a fronte delle priorità delle regole
contenute nel ruleset– può impostare una variabile membro o proprietà– chiamare metodi– Halt o Update del ruleset
![Page 53: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/53.jpg)
Le custom Activity
![Page 54: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/54.jpg)
Custom Activities: perché?
• Per costruire in modo visuale ed a blocchi la logica dell'applicazione
• Per scomporre il problema in sottoproblemi• Activity 'esecutive'
– Eseguono codice, query su db, chiamate a WS, etc. etc.
• Activity di 'scambio dati'– Derivando HandleExternalEventActivity– Derivando CallExternalMethodActivity– Tool WCA
![Page 55: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/55.jpg)
Anatomia di una activity
• Definizione. L'insieme di proprietà ed eventi che costituiscono lo stato dell'Activity
• Esecuzione. Il comportamento dell'activity, cioè la "logica"
• Validazione. Le regole per il controllo dei parametri
• Design. La classe che è responsabile del rendering sulla superfice designer
• Toolbox. Il comportamento quando viene inserita nel designer
![Page 56: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/56.jpg)
Activity Component Model• Alle Activity si associano dei componenti tramite attributi• Questi componenti definiscono il comportamento:
– sul designer– per la validazione dei dati– durante la serializzazione (workflow di lunga durata)
Richiesto
Opzionale
[Designer(typeof(MyDesigner))] [Validator(typeof(MyValidator))]public class MyActivity: Activity {...}
Activity
Designer
Validator
SerializerServices
![Page 57: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/57.jpg)
Modello di esecuzione della Activity
È possibile fare l’override di questi metodi• Initialize()• Execute()• Cancel()• Compensate() (se implementa ICompensatableActivity)
Transizioni possibili
ActivityRuntime
Initialized Executing Closed
Canceled Compensating
![Page 58: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/58.jpg)
Esempio: la CodeActivity
// nel workflow ...private void CodeActivity1_ExecuteCode(object sender, EventArgs e){
...}
protected sealed override ActivityExecutionStatus Execute(ActivityExecutionContext ctx){ base.RaiseEvent(CodeActivity.ExecuteCodeEvent, this, EventArgs.Empty);
return ActivityExecutionStatus.Closed;}
![Page 59: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/59.jpg)
Esecuzione di una Composite Activity
Composite Activity
..
..
..
+= OnChildClosed
+= OnChildClosed
Execute()
Status.Closed()
Child Activity
Child Activity
![Page 60: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/60.jpg)
Activity Execution Context
Template Activity
Context Owner Activities
Ad ogni loop viene creato un contestodifferente che consente l'eventuale rollback
Context 1
Context 2
Context 3
Default Workflow Context
![Page 61: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/61.jpg)
Activity e validazione
![Page 62: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/62.jpg)
Validazione
• Ci sono diversi tipi di validazioni:– Validazione dei parametri
• La più usata ovviamente– Validazione della sequenza delle child Activity
• Usata dalle Activity composite– Validazione della posizione del "SetState"
• Usata dalle macchine a stati– Validazione delle CallExternalMethodActivity
• Utile per chi deriva questa classe– Validazione delle HandleExternalEventActivity
• Utile per chi deriva questa classe
![Page 63: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/63.jpg)
ActivityValidator, ActivityCompositeValidator
public class MyValidator : ActivityValidator{ public override ValidationErrorCollection ValidateProperties( ValidationManager manager, object obj) { ValidationErrorCollection errs = new ValidationErrorCollection( base.ValidateProperties(manager, obj)); Activity1 act = obj as Activity1;
if(act.HisName != null && act.HisName.Length == 1) errs.Add(new ValidationError("HisName cannot be 1 char", 1));
return errs; }}
[ActivityValidator(typeof(MyValidator))]public partial class Activity1 : Activity{
...}
logica di validazione
Activity da validare
![Page 64: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/64.jpg)
Quali proprietà validare?
• ValidationOption.None– Nessuna validazione
• ValidationOption.Optional– Sono accettati i null
• ValidationOption.Required– Validazione obbligatoria
[ValidationOption(ValidationOption.Required)]public string EmailAddress{ get {...} set {...}}
![Page 65: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/65.jpg)
Le macchine a stati
![Page 66: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/66.jpg)
Concetti base• È composta da un
insieme di stati
• In ogni stato attende degli eventi
• Abbinato a ciascun evento si avviano delle azioni e/o una transizione ad un nuovo stato
S1 S2 S3
S4
S5
![Page 67: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/67.jpg)
Activity presenti solo nelle macchine a stati
• State: rappresenta uno degli stati in cui può essere la macchina
• StateInitialization: permette diinizializzare un particolare stato
• StateFinalization: permette di disporrele risorse prima che lo stato venga abbandonato
• SetState: esegue la transizione ad un altro stato
(*) eda = Event Driven Activity
![Page 68: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/68.jpg)
Macchine a stati o Workflow sequenziali
• Workflow Sequenziali sono preferibili quando– le possibilità di passare da uno stato all'altro sono
limitate– l'interazione con un essere umano è limitata
• Macchine a stati– c'è una vasta scelta di possibili cambi di stato– ci sono eventi comuni a tutti gli stati che
provocano la transizione allo stesso stato
![Page 69: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/69.jpg)
Macchina a stati
![Page 70: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/70.jpg)
Riflessioni
![Page 71: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/71.jpg)
Performance
• L'infrastruttura di Workflow Foundation fornisce tanti vantaggi ma ha un costo
• Se l'interazione con l'essere umano è alta, il costo in performance di WF diventa indifferente
• Paradossalmente, usare WF per un algoritmo matematico sarebbe terribilmente oneroso– parametri passati per object– uso di reflection
• http://msdn2.microsoft.com/en-us/library/aa973808.aspx
![Page 72: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/72.jpg)
Quale host per Workflow?
![Page 73: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/73.jpg)
Scenario 1: Applicazione Winform / WPF
• Runtime nello stesso AppDomain• DefaultWorkflowSchedulerService ok
– ExchangeDataService deve usare Invoke sulla form• ManualWorkflowSchedulerService sconsigliato
– può bloccare inutilmente la UI
• Scenari di esempio:– Macchina a stati per la gestione della UI– Sequenziale per la business logic
![Page 74: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/74.jpg)
Scenario Asp.net – elementi comuni
• Configurazione
• Runtime parte e si ferma insieme ad Application– Global.asax oppure un HttpModule
<configuration><configSections>
<section name="WorkflowRuntime"type="WorkflowRuntimeSection,System.Workflow.Runtime" />
</configSections> ....
![Page 75: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/75.jpg)
Scenario 2: Asp.net, durata inferiore alla pagina, stesso AppDomain
• DefaultWorkflowSchedulerService sconsigliato– Ciclo di vita della pagina è breve, WF è asincrono– Asp.net ha un set di thread limitato
• ManualWorkflowSchedulerService ok– Pagina e workflow sincroni– 1 thread per ogni istanza di Workflow
![Page 76: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/76.jpg)
Scenario 3: Asp.net, durata superiore alla pagina, stesso AppDomain
• Runtime parte e si ferma insieme ad Application– Global.asax oppure un HttpModule
• DefaultWorkflowSchedulerService – Se l'istanza dei workflow è condivisa tra tutte le
richieste• Usabile solo per poche istanze di workflow• Scenario poco realistico
– Il riciclo + Idle timeout dei worker process– ThreadAbortException sui thread che fanno lavorare
il workflow durante il riciclo o idle timeout (timer, ...)
![Page 77: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/77.jpg)
Scenario 4: Asp.net, Workflow pubblicato come WS
• Conseguenza del "Publish as a web service"– Il Workflow deve essere compilato (no XOML
dinamico)– AppDomain differente– Servizi aggiunti via web.config
• DefaultWorkflowSchedulerService ok• Problemi derivati dal riciclo + Idle timeout dei wp• Poco controllo sul WS
![Page 78: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/78.jpg)
Scenario 5: Workflow hostato manualmente in IIS, espone servizio WCF / WS
• Come scenario 4 ma ...– Richiede pubblicazione manuale– Molto più versatile (controllo completo)– Consente Workflow dinamici (XOML)
• Uso di HandleExternalEvent al posto delle WS Activities– Migliore riuso del Workflow!
• Posso usare WCF– Scelta migliore e più semplice rispetto al WS
• Problemi derivati dal riciclo + Idle timeout dei wp
![Page 79: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/79.jpg)
Scenario 6: Workflow hostato in WinService, espone servizio WCF
• Richiede più codice– Ma lo scheletro è standard– Orcas ci aiuta molto nell'integrazione con WCF
(questa è la strada giusta)• Non beneficiamo dell'Health Management di IIS
![Page 80: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/80.jpg)
Una possibile architettura
ClientTest(Winform)
ConsoleServiceHost(Console)
SubscriptionService(WCF Service)
SubscriptionWorkflowLibrary(Workflow)
ExternalDataExchangeWSDL
WindowsService
IISworker process
Asp.netWebApp
WPFClient
![Page 81: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/81.jpg)
Novità in Orcas
![Page 82: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/82.jpg)
Integrazione WCF + WF
• Si può esporre WF direttamente come servizio• Non sono più necessarie HandleExternEvent e
CallExternalMethod tra WCF e WF• Una montagna di codice in meno
• Il binding speciale wsHttpContextBinding consente di indirizzare uno specifico servizio– Utile ad esempio per indirizzare alla chiamata WCF l'ID del
Workflow già attivo all'interno del servizio– Analogo del Correlation Token
![Page 83: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/83.jpg)
Scenario semplificato
Asp.netHost
WCF
RichClient
![Page 84: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/84.jpg)
Servizi WCF che espongono Workflow
• Supportati i workflow che durano di più della chiamata WCF• Il contratto WCF viene gestito con 1+ ReceiveActivity
– Le sue child activity vengono chiamate prima del termine del metodo del servizio
• Scambio dati: one-way e request-response• Supportati gli scenari: workflow-first o contract-first
![Page 85: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/85.jpg)
Workflow che usano servizi WCF
• SendActivity invoca un servizio WCF
WCFSendActivity
![Page 86: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/86.jpg)
DurableService
• Decorando un metodo di un servizio del Workflow con [DurableServiceAttribute] il suo stato viene persistito al termine dell'esecuzione– Provider SQL pronto all'uso– Ottima soluzione anche per WCF senza WF
![Page 87: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/87.jpg)
Host di Servizi
• WCFWorkflowServiceHost (che deriva da ServiceHost) gestisce l'hosting del servizio con Workflow
• Visual Studio Orcas provvede l'auto-hosting!!!
WorkflowServiceHost wsh = new WorkflowServiceHost(typeof(MyWorkflow));wsh.Open();Console.WriteLine("Press <Enter> to Exit");Console.ReadLine();wsh.Close();
![Page 88: Introduzione a Workflow Foundation](https://reader035.fdocuments.us/reader035/viewer/2022081413/546ac06faf7959664c8b4f70/html5/thumbnails/88.jpg)
SOA, SOA, SOA
Domande?