personalizzazione dell'ambiente Raffaele Rialdi Visual Developer Security MVP MVP Profile: http://snipurl.com/f0cv [email protected] PRESENTATION Presentation Framework System.Windows (3.0) DATA ASP.NET ADO.NET System.Web (2.0) Compilation Configuration Handlers Hosting Mail Management Security UI (2.0) Util System.Data Common Odbc OleDb OracleClient Sql SqlClient Annotations Automation Controls Data Documents Ink Interop Navigation Resources Serialization Shapes Printing Subsystem Threading System.Printing (3.0) System.Windows.Media (3.0) GDI+ 3D System.Drawing Animation Design Imagine Drawing2D Windows Forms Printing System.Windows.Forms (2.0) Design Layout VisualStyles COMMUNICATION Language Integrated Query System.Query (F) System.Data.DLinq (F) System.Xml.XLinq (F) System.Expressions (F) Windows File System System.Storage (F) Core Audio ASP.NET Data Management Calendar System.Web Contacts Caching Documents Profile Image SessionState Media Messages XML Data Rules System.Xml Sync Schema Video Serialization XPath XPS Documents Xsl System.Windows.Xps (3.0) System.IO.Packaging (3.0) Windows Communications Foundation System.ServiceModel (3.0) Channels Configuration Diagnostics Integration QueueHelper System.ServiceModel.Security(3.0) Protocols Tokens 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 Network Class Library System.Net Cache Mail (2.0) Network Information (2.0) Security (2.0) Sockets ASMX Web Services System.Web.Services Identity Management Microsoft.InfoCards (3.0) MSMQ .NET Remoting System.Messaging System.Runtime.Remoting Directory Services .NET Remoting System.DirectoryServices System.Runtime.Remoting Speech Integration System.Speech (3.0) Recognition Synthesis FUNDAMENTALS BASE CLASS LIBRARIES System System.Text System.CodeDom System.ServiceProcess System.Resrouces System.Text AccessControl Managed Add-In Framework (2.0) System.Addins (F) Cryptography (2.0) Contact Permissions Microsoft.Build (2.0) System.Configuration Policy Principal (2.0) System.EnterpriseServices System.Transactions (2.0) System.ComponentModel System.Threading System.Timers System.Diagonostics System.IO (2.0) System.Text Generic (2.0) System.Reflection Email System.Runtime CompilerServices ConstrainedExecution(2.0) InteropServices Hosting Serialization Versioning “ClickOnce” Deployment System.Deployoment (2.0) KEY (2.0) (3.0) - New WINDOWS VISTA (2.0) - Substantially Improved - Windows Presentation Foundation (formerly codenamed “Avalon”) - Windows Communication Foundation (formerly codenamed “Indigo”) - Windows Workflow Foundation A chi serve Workflow? Perché già in una beta 2 parlare di designer e customizzazione? 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 servizio ds.AddService(svc); Comunicazione 1. Definire una Interfaccia e marcarla con [ExternalDataExchange] • • 2. 3. 4. 5. Dichiarare gli eventi per comunicare verso WF event EventHandler<MyEventArgs> Foo; Dichiarare metodi per comunicare verso l'host void 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 Services Activity [Designer(typeof(MyDesigner))] [CodeGenerator(typeof(MyCodeGen))] Serializer Code Generator [Validator(typeof(MyValidator))] public class MyActivity: Activity {...} Richiesto Opzionale 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) { ... } Modello di esecuzione della Activity Transizioni possibili Runtime Activity Initialized Canceled Compensating Executing Closed Activity Execution Methods • • • • Initialize() Execute() Cancel() Compensate() (se implementa ICompensatableActivity) Esecuzione di una Composite Activity Execute() Composite Activity += OnChildClosed += OnChildClosed Child Activity .. .. .. Child Activity 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 Default Workflow Context Context 1 Context 2 Context 3 Ad ogni loop viene creato un contesto differente 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(ValidationOption.Required)] public string EmailAddress { get {...} set {...} } • ValidationOption.None – Nessuna validazione • ValidationOption.Optional – Sono accettati i null • ValidationOption.Required – Validazione obbligatoria 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 Domande?