Inversion of Control @ CD2008

Preview:

DESCRIPTION

Inversion of Control @ CD2008

Citation preview

Realizzare applicazioni estendibili e configurabili

Ambizioso?

Mauro Servienti

Microsoft MVP - Visual C#

Software Mason @ Managed Designs S.r.l.

mauro.servienti@manageddesigns.it

Agenda

• Perchè?• Il “problema”;• Dogmi:

– Open Closed Principle;– Single Point of Responsability;

• Best Practice(s);• Inversion Of Control;• Chain Of Responsability;• Una voce fuori dal coro: System.AddIn;

• La bacchetta magica non esiste:– Ogni volta è una nuova avventura;– Non c’è una ricetta che vada bene per tutte le

salse ;-)– Esistono i Design Pattern....ma...

• Partire dai Pattern è rischioso:– Rischia di farci perdere la visione concreta del

progetto;– Refactoring to Pattern: “software mason”;

IMHO

ESTENSIBILITÀ... WHO CARES?

Perchè abbiamo bisogno di realizzare applicazioni estensibili.

• Supporto per l’integrazione e l’interoperabilità;

• Consente di modificare a caldo il comportamento;

• Elevatissima manutenibilità;• Verticalizzazione;• Testing;• Può essere un’ottimo “strumento”

commerciale;

Perchè?

LE DIPENDENZE STATICHEUn primo approccio al problema

il problema: le dipendenze statiche

Componente

ComAComponente

ComB

Componente

ComA

Componente

ComB

Interfaccia

IComB

Il cammino verso la soluzione...

...to be continued

I PRINCIPI GUIDAFobia da “dipendenza statica”?, un faro nella nebbia...

Open Closed Principle

“software entities should be open for extension, but closed for modification”

• Open for Extension:– Il componente deve essere estendibile;

• Closed for Modification:– L’estensione non deve portare ad una

rottura del rapporto;

Ma in soldoni?

• Quello che vogliamo evitare è che una semplice modifica in un punto si propaghi a macchi d’olio in tutta l’applicazione;– Eg: sostituibilità a “caldo” del DAL

• Se abbiamo un riferimento al DAL concreto non siamo “Closed”;

• Se facciamo assunzioni particolari non siamo “Closed”;

Non “Closed”

Single Point of Responsability

• Ad ognuno il suo ruolo;• Lo scope del ruolo assegnato deve

essere il più preciso possibile (focuse);

• Se ad un componente assegno più responsabilità violo l’Open Closed Principle;

Troppe responsabilità

BEST PRACTICE(S)Il panico da “Empty Solution”

Scrivere in ottica estensibilità

• Interfaces vs. Abstract classes;• Pensare agli entry point;• Prevedere quali dati potranno essere

necessari;• Le “pipeline”, un esempio da seguire:

– HttpModule, HttpHanlder;• Refactoring, refactoring, refactoring,

refactoring e ancora refactoring;

Interfaces vs. Abstract classes

Interface• Posso simulare

ereditarietà multipla;• Non “brucio” l’unico punto

di inheritance

Abstract Class• Mi permette di fornire

un’implementazione di base alle classi derivate;

• Colgo il meglio dei due mondi:• Interface verso il chiamante;• Abstract Class(es) nel modello;

Quindi?

Il meglio dei due mondi (1)

Il meglio dei due mondi (2)

...to be continued

Entry Point

• Dove avrò bisogno di estendere:– Ovunque ;-), mai chiudersi le porte...

• Un esempio: la “Conversazione”– è la Session? Si;– Perchè non usare la Session? E se

domani mattina la Session non mi andasse più bene?

– Mettiamo le mani avanti: “Facade”

Mascheriamo

...ma dietro le quinte?

• Slega il nostro modello da Asp.Net;– Siamo “Open”!;

• Quanto abbiamo investito?

Prevedere...

• Non abbiamo la sfera di cristallo• Incapsulare i dati in classi adatte al

loro trasporto: – EventArgs;– CancelEventArgs;– CustomEventArgs : estendiamo

CancelEventArgs/EventArgs

“Trasportare” i dati

• le informazioni non sono sufficienti

• ...non compila più: non siamo “Closed”

Le “pipeline”

• “pipeline”, un esempio da seguire:– HttpModule + HttpHanlder;

IProcessor

AIProcessor

BIProcessor

CIProcessor

n

Request

Data

Le “pipeline” (code)

Inversion of Control

Componente

ComA

Componente

ComB

Interfaccia

IComBServiceProvider(IoC Container)

IoCConfig

DEMOVediamolo in azione....

IoC Containers e non solo

• StructureMap;• Castle Windsor;• Spring.NET• Unity (Enterprise Library 4.0)

I’ve got the power <cit.>

• Se volessimo cambiare l’ordine...?• Se volessimo aggiungere/rimuovere

step...?• Se volessimo fare il tutto “a caldo”...?

DEMOVediamolo in azione....

IoC Containers: cosa offrono

• Contenitore di Servizi;• Lifecycle management;• Policy Injection (interceptors);

• Difetti? Si la gestione della configurazione...

DOMANDE?Non sparate sul pianista....

IL MODULO DI FEEDBACKGrazie a tutti, mi raccomando...

Recommended