Raffaele Rialdi

31
Raffaele Rialdi Raffaele Rialdi MVP Profile: http://snipurl.com/f0cv personalizzazion e dell'ambiente [email protected] [email protected] Visual Developer Security Visual Developer Security MVP MVP

description

personalizzazione dell'ambiente. Raffaele Rialdi. Visual Developer Security MVP. [email protected]. 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 - PowerPoint PPT Presentation

Transcript of Raffaele Rialdi

Raffaele RialdiRaffaele Rialdi

MVP Profile: http://snipurl.com/f0cv

personalizzazione dell'ambiente

[email protected]@vevy.comVisual Developer Security MVPVisual Developer Security MVP

PRESENTATION

ASP.NETSystem.Web (2.0)CompilationConfigurationHandlersHostingMailManagementSecurityUI (2.0)Util

Presentation FrameworkSystem.Windows (3.0)

AnnotationsAutomationControlsDataDocumentsInkInteropNavigationResourcesSerializationShapesThreading

System.Windows.Media (3.0)

3DAnimationImagine

Windows FormsSystem.Windows.Forms (2.0)

DesignLayoutVisualStyles

Printing SubsystemSystem.Printing (3.0)GDI+System.Drawing

DesignDrawing2DPrinting

ADO.NETSystem.DataCommonOdbcOleDbOracleClientSqlSqlClient

ASP.NET Data ManagementSystem.WebCachingProfileSessionState

XML Data System.XmlSchemaSerializationXPathXsl

Windows File SystemSystem.Storage (F)CoreAudioCalendarContactsDocumentsImageMediaMessagesRulesSyncVideo

XPS DocumentsSystem.Windows.Xps (3.0)System.IO.Packaging (3.0)Speech IntegrationSystem.Speech (3.0)RecognitionSynthesis

Language Integrated QuerySystem.Query (F)System.Data.DLinq (F)System.Xml.XLinq (F)System.Expressions (F)

Windows Communications FoundationSystem.ServiceModel (3.0)

ChannelsConfigurationDiagnosticsIntegrationQueueHelper

System.ServiceModel.Security(3.0)

ProtocolsTokens

Network Class LibrarySystem.Net CacheMail (2.0)Network Information (2.0)Security (2.0)Sockets

.NET RemotingSystem.Runtime.Remoting

ASMX Web ServicesSystem.Web.Services

Identity ManagementMicrosoft.InfoCards (3.0)

MSMQSystem.Messaging

Directory ServicesSystem.DirectoryServices

DATA COMMUNICATION

FUNDAMENTALS

BASE CLASS LIBRARIESSystem

System.CodeDomSystem.ComponentModelSystem.Diagonostics

System.IO (2.0)

System.Resrouces

System.Text

System.ServiceProcess

System.ThreadingSystem.TimersSystem.EnterpriseServicesSystem.Transactions (2.0)

.NET RemotingSystem.Runtime.Remoting

System.TextGeneric (2.0)

System.Reflection

EmailSystem.Configuration

System.TextAccessControl (2.0)Cryptography (2.0)PermissionsPolicyPrincipal (2.0)

Managed Add-In FrameworkSystem.Addins (F)

Contact

Microsoft.Build (2.0)

System.RuntimeCompilerServicesConstrainedExecution(2.0)InteropServicesHostingSerializationVersioning

“ClickOnce” DeploymentSystem.Deployoment (2.0)

WINDOWS VISTA

(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

Windows Workflow FoundationSystem.Workflow (3.0)System.Workflow.Activities (3.0)

RulesSystem.Workflow.ComponentModel (3.0)

CompilerDesignerSerialization

System.Workflow.Runtime (3.0)HostingMessaging

A chi serve Workflow?A chi serve Workflow?

Perché già in una beta 2 parlare di Perché già in una beta 2 parlare di designer e customizzazione?designer e customizzazione?

Workflow e serviziWorkflow e servizi

• I servizi di WF sono pluggabiliI servizi di WF sono pluggabili– questa architettura permette l'espandibilità futura questa architettura permette l'espandibilità futura

dell'infrastruttura di Workflowdell'infrastruttura di Workflow

• Alcuni esempi:Alcuni esempi:– ExternalDataExchangeService (comunicazione tra ExternalDataExchangeService (comunicazione tra

host e workflow)host e workflow)– WorkflowSchedulerServiceWorkflowSchedulerService– WorkflowTransactionServiceWorkflowTransactionService– WorkflowPersistenceServiceWorkflowPersistenceService– TrackingServiceTrackingService– Custom (derivato da WorkflowRuntimeService)Custom (derivato da WorkflowRuntimeService)– WorkflowCompilerOptionsServiceWorkflowCompilerOptionsService– ToolboxServiceToolboxService– ............

Due mondi: il workflow e l'hostDue mondi: il workflow e l'host

Thread 1Thread 1Thread 2Thread 2

ExternalDataExchangeService ds = new ExternalDataExchangeService();

_Runtime.AddService(ds);

MyService svc = new MyService();

// informiamo WF del nostro serviziods.AddService(svc);

public class MyService : IMyService

ComunicazioneComunicazione1.1. Definire una Interfaccia e marcarla con Definire una Interfaccia e marcarla con

[[ExternalDataExchangeExternalDataExchange]]• Dichiarare gli eventi per comunicare verso WFDichiarare gli eventi per comunicare verso WF

event EventHandler<MyEventArgs> Foo;event EventHandler<MyEventArgs> Foo;• Dichiarare metodi per comunicare verso l'hostDichiarare metodi per comunicare verso l'host

void FromWorkflow(string Message);void FromWorkflow(string Message);

2.2. Implementare l'interfaccia in una classeImplementare l'interfaccia in una classe• la UI va aggiornata via Invokela UI va aggiornata via Invoke

3.3. Scrivere una classe (marcata con Serializable) che Scrivere una classe (marcata con Serializable) che deriva da deriva da ExternalDataEventArgsExternalDataEventArgs per passare dei per passare dei parametriparametri

4.4. Gestire nel workflow i messaggi in ingresso con Gestire nel workflow i messaggi in ingresso con HandleExternalEventActivityHandleExternalEventActivity

5.5. Spedire messaggi verso l'host con Spedire messaggi verso l'host con CallExternalMethodActivityCallExternalMethodActivity

Custom Activities: perché?Custom Activities: perché?

• Per costruire in modo visuale ed a Per costruire in modo visuale ed a blocchi la logica dell'applicazioneblocchi la logica dell'applicazione

• Per scomporre il problema in Per scomporre il problema in sottoproblemisottoproblemi

• Activity 'esecutive'Activity 'esecutive'– Eseguono codice, query su db, chiamate a Eseguono codice, query su db, chiamate a

WS, etc. etc.WS, etc. etc.

• Activity di 'scambio dati'Activity di 'scambio dati'– Derivando HandleExternalEventActivityDerivando HandleExternalEventActivity– Derivando CallExternalMethodActivityDerivando CallExternalMethodActivity

System.Workflow.ComponentModel.ActivitySystem.Workflow.ComponentModel.Activity

• Le Activity sono il "mattoncino" di WFLe Activity sono il "mattoncino" di WF• Ci sono tre tipologie di ActivityCi sono tre tipologie di Activity

– Basic:Basic: semplici nodi di un programma semplici nodi di un programma• SendMail, call WebService, etc. etc.SendMail, call WebService, etc. etc.

– Composite:Composite: contenitori che consentono di contenitori che consentono di modellare e coordinare le activity basemodellare e coordinare le activity base• SequentialActivitySequentialActivity• ParallelActivityParallelActivity• ......

– Root:Root: Activity speciali che costituiscono Activity speciali che costituiscono una unità di attivazione.una unità di attivazione.Microsoft ne fornisce due:Microsoft ne fornisce due:

• SequentialWorkflowActivitySequentialWorkflowActivity• StateMachineWorkflowActivityStateMachineWorkflowActivity

Anatomia di una activityAnatomia di una activity

• Definizione.Definizione. L'insieme di proprietà ed L'insieme di proprietà ed eventi che costituiscono lo stato eventi che costituiscono lo stato dell'Activitydell'Activity

• Esecuzione.Esecuzione. Il comportamento Il comportamento dell'activity, cioè la "logica"dell'activity, cioè la "logica"

• Validazione.Validazione. Le regole per il controllo Le regole per il controllo dei parametridei parametri

• Design.Design. La classe che è responsabile La classe che è responsabile del rendering sulla superfice designerdel rendering sulla superfice designer

• Toolbox.Toolbox. Il comportamento quando Il comportamento quando viene inserita nel designerviene inserita nel designer

Activity Component ModelActivity Component Model

Richiesto

Opzionale

• Alle Activity si associano dei componenti tramite attributiAlle Activity si associano dei componenti tramite attributi• Questi componenti definiscono il comportamento:Questi componenti definiscono il comportamento:

– sul designersul designer– per la validazione dei datiper la validazione dei dati– durante la serializzazionedurante la serializzazione

(workflow di lunga durata)(workflow di lunga durata)– della persistenza nel codicedella persistenza nel codice

(via codedom)(via codedom)

[Designer(typeof(MyDesigner))]

[CodeGenerator(typeof(MyCodeGen))]

[Validator(typeof(MyValidator))]

public class MyActivity: Activity {...}

ActivityActivity

Code Code GeneratoGenerato

rr

DesignerDesigner

ValidatorValidator

SerializerSerializerServicesServices

Operazioni tipiche delle Custom Operazioni tipiche delle Custom ActivityActivity

• Se necessario, due override:Se necessario, due override:– Initialize (alloca risorse)Initialize (alloca risorse)– Cancel (le rilascia)Cancel (le rilascia)

• Se l'activity supporta le transazioniSe l'activity supporta le transazioni– Compensate (rollback)Compensate (rollback)

• Sempre necessario fare l'override di:Sempre necessario fare l'override di:– Execute (esecuzione della logica) Execute (esecuzione della logica)

ritornando lo stato dell'activityritornando lo stato dell'activity• Cancelling, Cancelling, ClosedClosed, Compensating, Executing, , Compensating, Executing,

Faulting, InitializedFaulting, Initialized

Esempio: la CodeActivityEsempio: la CodeActivity

protected sealed override ActivityExecutionStatusExecute(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 ActivityModello di esecuzione della Activity

Transizioni possibili

Activity Execution MethodsActivity Execution Methods• Initialize()Initialize()• Execute()Execute()• Cancel()Cancel()• Compensate() Compensate() (se implementa ICompensatableActivity)(se implementa ICompensatableActivity)

ActivityRuntime

InitializedInitialized ExecutingExecuting ClosedClosed

CanceledCanceled CompensatingCompensating

Esecuzione di una Composite ActivityEsecuzione di una Composite Activity

Composite ActivityComposite Activity

..

..

..

+= OnChildClosed+= OnChildClosed

+= OnChildClosed+= OnChildClosed

Execute()Execute()

Status.Closed()Status.Closed()

Child Child ActivityActivity

Child Child ActivityActivity

Sequence Activity – Execute()Sequence Activity – Execute()protected override Status Execute(ActivityExecutionContext context)protected override Status Execute(ActivityExecutionContext context){{

Activity Activity childAchildActivity = this.ExecutableActivities[0];ctivity = this.ExecutableActivities[0];EventHandler<ActivityStatusChangeEventArgs> OnClosed = null;EventHandler<ActivityStatusChangeEventArgs> OnClosed = null;OnClosed = delegateOnClosed = delegate{{

childAchildActivity.Closed -= OnClosed;ctivity.Closed -= OnClosed;if (this.Status == Status.Canceling)if (this.Status == Status.Canceling) context.CloseActivity();context.CloseActivity();else if (this.Status == Status.Executing)else if (this.Status == Status.Executing){{ this.index++;this.index++; if (this.ExecutableActivities.Count > this.index)if (this.ExecutableActivities.Count > this.index) {{

childAchildActivityctivity = this.ExecutableActivities[this.index];= this.ExecutableActivities[this.index];

childAcchildActivity.Closed += OnClosed;tivity.Closed += OnClosed; context.ExecuteActivity(childActivity );context.ExecuteActivity(childActivity );

}} elseelse context.CloseActivity();context.CloseActivity();}}

};};childActivitychildActivity.Closed.Closed += OnClosed; += OnClosed;context.ExecuteActivity(childActivity);context.ExecuteActivity(childActivity);return Status.Executing;return Status.Executing;

}}

Activity Execution ContextActivity Execution Context

Template ActivityTemplate Activity

Context Owner ActivitiesContext Owner Activities

Ad ogni loop viene creato un contestoAd ogni loop viene creato un contestodifferente che consente l'eventuale rollbackdifferente che consente l'eventuale rollback

Context 1Context 1

Context 2Context 2

Context 3Context 3

Default Workflow Default Workflow ContextContext

Sub - workflowSub - workflow

• I Workflow sono Activity e quindi ....I Workflow sono Activity e quindi ....

• Oltre a poter creare Activity composite Oltre a poter creare Activity composite è possibile eseguire veri e propri è possibile eseguire veri e propri workflow grazie a:workflow grazie a:

InvokeWorkflowActivityInvokeWorkflowActivity

ValidazioneValidazione

• Ci sono diversi tipi di validazioni:Ci sono diversi tipi di validazioni:– Validazione dei parametriValidazione dei parametri

• La più usata ovviamenteLa più usata ovviamente

– Validazione della sequenza delle child Validazione della sequenza delle child ActivityActivity• Usata dalle Activity compositeUsata dalle Activity composite

– Validazione della posizione del "SetState"Validazione della posizione del "SetState"• Usata dalle macchine a statiUsata dalle macchine a stati

– Validazione delle Validazione delle CallExternalMethodActivityCallExternalMethodActivity• Utile per chi deriva questa classeUtile per chi deriva questa classe

– Validazione delle Validazione delle HandleExternalEventActivityHandleExternalEventActivity• Utile per chi deriva questa classeUtile per chi deriva questa classe

ActivityValidator, ActivityValidator, ActivityCompositeValidatorActivityCompositeValidator

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;}

}

[ActivityValidator(typeof(MyValidator))]public partial class Activity1 : Activity{

...}

logica di validazionelogica di validazione

Quali proprietà validare?Quali proprietà validare?

• ValidationOption.NoneValidationOption.None– Nessuna validazioneNessuna validazione

• ValidationOption.OptionalValidationOption.Optional– Sono accettati i nullSono accettati i null

• ValidationOption.RequiredValidationOption.Required– Validazione obbligatoriaValidazione obbligatoria

[ValidationOption(ValidationOption.Required)]public string EmailAddress{ get {...} set {...}}

ActivityDesignerActivityDesigner

• Classe di supporto alla ActivityClasse di supporto alla Activity• Derivando questa classe si crea un nuovo Derivando questa classe si crea un nuovo

Designer per una custom activityDesigner per una custom activity– painting del "box" dell'activitypainting del "box" dell'activity– help texthelp text– tooltiptooltip– gestione di mouse/tastiera sull'activitygestione di mouse/tastiera sull'activity– menu contestualemenu contestuale– evento di defaultevento di default

• CompositeActivityDesigner in più:CompositeActivityDesigner in più:– painting negli stati espanso/collassatopainting negli stati espanso/collassato– painting nelle fasi di drag&droppainting nelle fasi di drag&drop– painting delle child activitypainting delle child activity

Creare un Designer per le ActivityCreare un Designer per le Activity

System.Object System.Workflow.ComponentModel.Design.ActivityDesigner

System.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.FreeformActivityDesigner

public class SendMailDesigner : ActivityDesigner{ protected override Size OnLayoutSize(ActivityDesignerLayoutEventArgs e) { return new Size(230, 100); } protected override void OnPaint(ActivityDesignerPaintEventArgs e) { e.Graphics.DrawString( ...... ); ..... }}

[Designer(typeof(SendMailDesigner), typeof(IDesigner))][ActivityValidator(typeof(ParametersValidator))]public partial class SendMailActivity : Activity { ... }

ActivityToolboxItemActivityToolboxItem

• Definisce il comportamento di default Definisce il comportamento di default che deve avere una Activity quando che deve avere una Activity quando viene posta (drop) sul workflowviene posta (drop) sul workflow

• Tipico esempio: aggiunta in automatico Tipico esempio: aggiunta in automatico di una child activitydi una child activity

Le "Rules" (regole)Le "Rules" (regole)

• Le regole in WFLe regole in WF– Permettono di modellare più facilmente la Permettono di modellare più facilmente la

logicalogica– Rendono più semplice la comprensione Rendono più semplice la comprensione

della logica del sistemadella logica del sistema– Permettono di eseguire modifiche in modo Permettono di eseguire modifiche in modo

semplice e comprensibilesemplice e comprensibile

– Le Activity Policy permettono di stabilire Le Activity Policy permettono di stabilire una sequenza di regole (percentuali una sequenza di regole (percentuali applicate in sequenze diverse ad esempio)applicate in sequenze diverse ad esempio)

RuleSetRuleSet

• Due dialog usabili anche fuori da WF:Due dialog usabili anche fuori da WF:– RuleSetDialogRuleSetDialog– RuleConditionDialogRuleConditionDialog

• Sono in preparazione Dialog ancora più Sono in preparazione Dialog ancora più specializzate, ad esempio, per BizTalkspecializzate, ad esempio, per BizTalk

I ThemesI Themes

• Sono una sorta di foglio di stile per il Sono una sorta di foglio di stile per il designerdesigner

• Sono in formato .... xml Sono in formato .... xml (.wtm) (.wtm)• VS2005 (+ WF Extensions) ha un editor VS2005 (+ WF Extensions) ha un editor

che si trova in Tools – Options – che si trova in Tools – Options – WorkflowWorkflow

• Permette di cambiare colori, font, stile Permette di cambiare colori, font, stile delle linee, background, ombredelle linee, background, ombre

• L'applicazione che tiene in host il L'applicazione che tiene in host il designer può applicare designer può applicare programmaticamente i Themesprogrammaticamente i Themes

I GlyphI Glyph

• Sono dei marker apposti sopra il Sono dei marker apposti sopra il disegno della activitydisegno della activity– CommentGlyphCommentGlyph– ConfigErrorGlyphConfigErrorGlyph– LockedActivityGlyphLockedActivityGlyph– ReadOnlyActivityGlyphReadOnlyActivityGlyph– SelectionGlyphSelectionGlyph– ShadowGlyphShadowGlyph

• Tipico utilizzo: marcare le activity in Tipico utilizzo: marcare le activity in modo visuale durante il trackingmodo visuale durante il tracking(Esempio Workflow Monitor dell'sdk)(Esempio Workflow Monitor dell'sdk)

ToolboxToolbox

• [ToolboxBitmap(typeof(MailActivity), "raf.bmp")][ToolboxBitmap(typeof(MailActivity), "raf.bmp")]

– bitmap 16x16bitmap 16x16– nome completo di namespace escluso nome completo di namespace escluso

quello di "MailActivity"quello di "MailActivity"– La bitmap appare dentro il box dell'activityLa bitmap appare dentro il box dell'activity– La bitmap appare nella toolbox solo se si La bitmap appare nella toolbox solo se si

aggiunge con add item. Nella toolbox aggiunge con add item. Nella toolbox appare l'icona di default se l'activity è appare l'icona di default se l'activity è aggiungta in automatico da vs.netaggiungta in automatico da vs.net

– Vogliamo di più?Vogliamo di più?

Volete provare le brezza della beta2?Volete provare le brezza della beta2?

• Prerequisiti:Prerequisiti:– VS2005 RTM (opzionale ma in questo VS2005 RTM (opzionale ma in questo

momento senza è un'impresa titanica)momento senza è un'impresa titanica)– Disinstallare tutte le beta precedenti di Disinstallare tutte le beta precedenti di

WinFXWinFX

• Installare:Installare:– WinFX runtimeWinFX runtime– Windows Vista SDK (beta) (lanciare .msi se Windows Vista SDK (beta) (lanciare .msi se

l'exe fallisce)l'exe fallisce)– Estensioni di Visual Studio (contengono Estensioni di Visual Studio (contengono

Cider)Cider)– Estensioni di Workflow x Visual StudioEstensioni di Workflow x Visual Studio– Esempi "Hands On Lab" (msdn website)Esempi "Hands On Lab" (msdn website)

RisorseRisorse

• www.windowsworkflow.netwww.windowsworkflow.net• http://msdn.microsoft.com/workflowhttp://msdn.microsoft.com/workflow• www.workflowfoundation.netwww.workflowfoundation.net• Channel 9Channel 9• The book (obsoleto - beta1)The book (obsoleto - beta1)• I tanti blogI tanti blog• msdn magazine (articoli di Dino Esposito)msdn magazine (articoli di Dino Esposito)• msdn magazine Gennaio 2006msdn magazine Gennaio 2006

Domande?Domande?