310 likes | 449 Views
personalizzazione dell'ambiente. Raffaele Rialdi. Visual Developer Security MVP. malta@vevy.com. MVP Profile: http://snipurl.com/f0cv. Windows Workflow Foundation System.Workflow (3.0) System.Workflow.Activities (3.0) Rules System.Workflow.ComponentModel (3.0) Compiler Designer
E N D
personalizzazione dell'ambiente Raffaele Rialdi Visual Developer Security MVP malta@vevy.com MVP Profile: http://snipurl.com/f0cv
Windows Workflow Foundation • System.Workflow(3.0)System.Workflow.Activities(3.0) • Rules • System.Workflow.ComponentModel(3.0) • Compiler • Designer • Serialization • System.Workflow.Runtime(3.0) • Hosting • Messaging MSMQ System.Messaging (2.0) (3.0) - New (2.0) - Substantially Improved - Windows Presentation Foundation (formerly codenamed “Avalon”) - Windows Communication Foundation (formerly codenamed “Indigo”) - Windows Workflow Foundation KEY PRESENTATION DATA COMMUNICATION • Windows Communications Foundation • System.ServiceModel(3.0) • Channels • Configuration • Diagnostics • Integration • QueueHelper • System.ServiceModel.Security(3.0) • Protocols • Tokens • Presentation Framework • System.Windows(3.0) • Annotations • Automation • Controls • Data • Documents • Ink • Interop • Navigation • Resources • Serialization • Shapes • Threading • System.Windows.Media (3.0) • 3D • Animation • Imagine • ASP.NET • System.Web(2.0) • Compilation • Configuration • Handlers • Hosting • Mail • Management • Security • UI (2.0) • Util Language Integrated Query System.Query(F) System.Data.DLinq(F) System.Xml.XLinq(F) System.Expressions(F) • ADO.NET • System.Data • Common • Odbc • OleDb • OracleClient • Sql • SqlClient • Windows File SystemSystem.Storage(F) • Core • Audio • Calendar • Contacts • Documents • Image • Media • Messages • Rules • Sync • Video • ASP.NET Data Management • System.Web • Caching • Profile • SessionState • Network Class Library • System.Net • Cache • Mail (2.0) • Network Information (2.0) • Security (2.0) • Sockets ASMX Web Services System.Web.Services Printing Subsystem System.Printing(3.0) Identity Management Microsoft.InfoCards(3.0) • GDI+System.Drawing • Design • Drawing2D • Printing • XML DataSystem.Xml • Schema • Serialization • XPath • Xsl • Windows FormsSystem.Windows.Forms (2.0) • Design • Layout • VisualStyles .NET Remoting System.Runtime.Remoting XPS Documents System.Windows.Xps(3.0) System.IO.Packaging(3.0) Directory Services System.DirectoryServices .NET Remoting System.Runtime.Remoting • Speech Integration • System.Speech(3.0) • Recognition • Synthesis FUNDAMENTALS BASE CLASS LIBRARIES • System.Text • AccessControl(2.0) • Cryptography (2.0) • Permissions • Policy • Principal (2.0) System.Text • System.Runtime • CompilerServices • ConstrainedExecution(2.0) • InteropServices • Hosting • Serialization • Versioning System • System.Text • Generic (2.0) • Managed Add-In Framework • System.Addins (F) • Contact System.CodeDom System.ServiceProcess • System.Reflection • Email System.Threading System.ComponentModel System.Timers System.Diagonostics Microsoft.Build (2.0) System.Configuration System.EnterpriseServices System.IO (2.0) System.Transactions (2.0) System.Resrouces “ClickOnce” Deployment System.Deployoment (2.0) WINDOWS VISTA
Perché già in una beta 2 parlare di designer e customizzazione? A chi serve Workflow?
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 • WorkflowTransactionService • WorkflowPersistenceService • TrackingService • Custom (derivato da WorkflowRuntimeService) • WorkflowCompilerOptionsService • ToolboxService • ......
Due mondi: il workflow e l'host Thread 2 Thread 1 public class MyService : IMyService ExternalDataExchangeService ds = new ExternalDataExchangeService();_Runtime.AddService(ds);MyService svc = new MyService();// informiamo WF del nostro serviziods.AddService(svc);
Comunicazione • Definire una Interfaccia e marcarla con [ExternalDataExchange] • Dichiarare gli eventi per comunicare verso WFevent EventHandler<MyEventArgs> Foo; • Dichiarare metodi per comunicare verso l'hostvoid FromWorkflow(string Message); • Implementare l'interfaccia in una classe • la UI va aggiornata via Invoke • Scrivere una classe (marcata con Serializable) che deriva da ExternalDataEventArgs per passare dei parametri • Gestire nel workflow i messaggi in ingresso con HandleExternalEventActivity • Spedire messaggi verso l'host con CallExternalMethodActivity
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
System.Workflow.ComponentModel.Activity • Le Activity sono il "mattoncino" di WF • 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
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
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) • della persistenza nel codice(via codedom) Designer Validator Activity Services Serializer Code Generator [Designer(typeof(MyDesigner))] [CodeGenerator(typeof(MyCodeGen))] [Validator(typeof(MyValidator))] public class MyActivity: Activity {...} Opzionale Richiesto
Operazioni tipiche delle Custom Activity • Se necessario, due override: • Initialize (alloca risorse) • Cancel (le rilascia) • Se l'activity supporta le transazioni • Compensate (rollback) • Sempre necessario fare l'override di: • Execute (esecuzione della logica) ritornando lo stato dell'activity • Cancelling, Closed, Compensating, Executing, Faulting, Initialized
Esempio: la CodeActivity protected sealed override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext){ base.RaiseEvent(CodeActivity.ExecuteCodeEvent, this, EventArgs.Empty); return ActivityExecutionStatus.Closed;} // nel workflow ...private void CodeActivity1_ExecuteCode(object sender, EventArgs e){ ...}
Executing Canceled Initialized Closed Compensating Modello di esecuzione della Activity Activity Execution Methods • Initialize() • Execute() • Cancel() • Compensate() (se implementa ICompensatableActivity) Transizioni possibili Runtime Activity
Child Activity Child Activity Esecuzione di una Composite Activity Composite Activity Execute() += OnChildClosed .. .. .. += OnChildClosed Status.Closed()
Sequence Activity – Execute() protected override Status Execute(ActivityExecutionContext context) { Activity childActivity = this.ExecutableActivities[0]; EventHandler<ActivityStatusChangeEventArgs> OnClosed = null; OnClosed = delegate { childActivity.Closed -= OnClosed; if (this.Status == Status.Canceling) context.CloseActivity(); else if (this.Status == Status.Executing) { this.index++; if (this.ExecutableActivities.Count > this.index) { childActivity= this.ExecutableActivities[this.index]; childActivity.Closed += OnClosed; context.ExecuteActivity(childActivity ); } else context.CloseActivity(); } }; childActivity.Closed += OnClosed; context.ExecuteActivity(childActivity); return Status.Executing; }
Activity Execution Context Template Activity Context Owner Activities Context 1 Default Workflow Context Context 2 Context 3 Ad ogni loop viene creato un contestodifferente che consente l'eventuale rollback
Sub - workflow • I Workflow sono Activity e quindi .... • Oltre a poter creare Activity composite è possibile eseguire veri e propri workflow grazie a: InvokeWorkflowActivity
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
ActivityValidator, ActivityCompositeValidator [ActivityValidator(typeof(MyValidator))] public partial class Activity1 : Activity{ ...} public class MyValidator : ActivityValidator { public override ValidationErrorCollection ValidateProperties(ValidationManager manager, object obj) { ValidationErrorCollection errs = new ValidationErrorCollection( base.ValidateProperties(manager, obj)); Activity1 act = manager.Context.Current as Activity1; if(act.HisName != null && act.HisName.Length == 1) errs.Add(new ValidationError("HisName cannot be 1 char", 1)); return errs; } } logica di validazione
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 {...} }
ActivityDesigner • Classe di supporto alla Activity • Derivando questa classe si crea un nuovo Designer per una custom activity • painting del "box" dell'activity • help text • tooltip • gestione di mouse/tastiera sull'activity • menu contestuale • evento di default • CompositeActivityDesigner in più: • painting negli stati espanso/collassato • painting nelle fasi di drag&drop • painting delle child activity
Creare un Designer per le Activity System.Object System.Workflow.ComponentModel.Design.ActivityDesigner System.Workflow.ComponentModel.Design.CompositeActivityDesigner System.Workflow.ComponentModel.Design.FreeformActivityDesigner [Designer(typeof(SendMailDesigner), typeof(IDesigner))] [ActivityValidator(typeof(ParametersValidator))] public partial class SendMailActivity :Activity { ... } public class SendMailDesigner : ActivityDesigner{ protected override Size OnLayoutSize(ActivityDesignerLayoutEventArgs e) { return new Size(230, 100); }protected override void OnPaint(ActivityDesignerPaintEventArgs e) { e.Graphics.DrawString( ...... ); ..... }}
ActivityToolboxItem • Definisce il comportamento di default che deve avere una Activity quando viene posta (drop) sul workflow • Tipico esempio: aggiunta in automatico di una child activity
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 • Le Activity Policy permettono di stabilire una sequenza di regole (percentuali applicate in sequenze diverse ad esempio)
RuleSet • Due dialog usabili anche fuori da WF: • RuleSetDialog • RuleConditionDialog • Sono in preparazione Dialog ancora più specializzate, ad esempio, per BizTalk
I Themes • Sono una sorta di foglio di stile per il designer • Sono in formato .... xml (.wtm) • VS2005 (+ WF Extensions) ha un editor che si trova in Tools – Options – Workflow • Permette di cambiare colori, font, stile delle linee, background, ombre • L'applicazione che tiene in host il designer può applicare programmaticamente i Themes
I Glyph • Sono dei marker apposti sopra il disegno della activity • CommentGlyph • ConfigErrorGlyph • LockedActivityGlyph • ReadOnlyActivityGlyph • SelectionGlyph • ShadowGlyph • Tipico utilizzo: marcare le activity in modo visuale durante il tracking(Esempio Workflow Monitor dell'sdk)
Toolbox • [ToolboxBitmap(typeof(MailActivity), "raf.bmp")] • bitmap 16x16 • nome completo di namespace escluso quello di "MailActivity" • La bitmap appare dentro il box dell'activity • La bitmap appare nella toolbox solo se si aggiunge con add item. Nella toolbox appare l'icona di default se l'activity è aggiungta in automatico da vs.net • Vogliamo di più?
Volete provare le brezza della beta2? • Prerequisiti: • VS2005 RTM (opzionale ma in questo momento senza è un'impresa titanica) • Disinstallare tutte le beta precedenti di WinFX • Installare: • WinFX runtime • Windows Vista SDK (beta) (lanciare .msi se l'exe fallisce) • Estensioni di Visual Studio (contengono Cider) • Estensioni di Workflow x Visual Studio • Esempi "Hands On Lab" (msdn website)
Risorse • www.windowsworkflow.net • http://msdn.microsoft.com/workflow • www.workflowfoundation.net • Channel 9 • The book (obsoleto - beta1) • I tanti blog • msdn magazine (articoli di Dino Esposito) • msdn magazine Gennaio 2006