raffaele rialdi mvp profile: personalizzazione dell'ambiente malta@vevy.com visual developer...
Post on 01-May-2015
215 Views
Preview:
TRANSCRIPT
Raffaele RialdiRaffaele Rialdi
MVP Profile: http://snipurl.com/f0cv
personalizzazione dell'ambiente
malta@vevy.commalta@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?
top related