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?
Scarica

Activity - Microsoft