ASP.NET MVC: Andare oltre il 100% (Web@work)

31
@ Web@Work ASP.NET MVC: Andare oltre il 100% Giorgio Di Nardo Proge-Software s.r.l. [email protected] @akelitz http://blogs.ugidotnet.org/akelitz

description

ASP.NET MVC è una piattaforma aperta costruita come un puzzle di componenti. Per personalizzare il comportamento dei componenti interni del sistema è quindi sufficiente rimuovere uno dei tasselli e sostituirlo con uno scritto da noi. Un'operazione resa semplice ed immediata dall'interfaccia Dependency Resolver.

Transcript of ASP.NET MVC: Andare oltre il 100% (Web@work)

Page 1: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Work

ASP.NET MVC:Andare oltre il 100%

Giorgio Di NardoProge-Software s.r.l.

[email protected]@akelitz

http://blogs.ugidotnet.org/akelitz

Page 2: ASP.NET MVC: Andare oltre il 100% (Web@work)

Web@WorkGrazie agli sponsor

Page 3: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kAgenda

• NuGet• Url localization• Dependency Resolver• Unit testing

Page 4: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kNuGet

Aggiungere un riferimentosenza NuGet

Aggiungere un riferimentocon NuGet

Aggiungere pacchetto

Trovarlo

Scaricarlo

Estrarlo

Referenziarlo

Configurarlo

Page 5: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kNuGet

• Un Package Manager per .NET e Visual Studio

• Installabile tramite Extension Manager

• Utilizzabile tramite:• GUI

• Console PowerShell

• Tool a riga di comando

• Supporta sorgenti multiple (pubbliche e private)

Page 6: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kCiclo di vita di una richiesta con ASP.NET MVC

Request

URL Routing

HTTP Handler

Controller Factory

Controller

Model Binder Action

Action Filter

Action Result

View Engine

View

Response

Page 7: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kLocalizzazione

• Processo attraverso il quale è possibile fornire il contenuto della nostra applicazione in diverse lingue senza dover riscrivere tutto

• Tipicamente ottenuto per mezzo di file di risorsa tradotti nelle varie lingue da supportare

• Disponibile out-of-the-box con ASP.NET

Page 8: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

k

demo

Page 9: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

k

• IControllerActivator • DefaultControllerActivator

• IControllerFactory (ControllerBuilder.Current.SetControllerFactory)• DefaultControllerFactory

• IViewPageActivator• DefaultViewPageActivator

• ModelMetadataProvider (ModelMetadataProviders.Current)• DataAnnotationsModelMetadataProvider

Singly Registered Services

Page 10: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

k

• IFilterProvider (FilterProviders.Providers)• FilterAttributeFilterProvider• GlobalFilterCollection• ControllerInstanceFilterProvider

• ModelValidatorProvider (ModelValidatorProviders.Providers)• DataAnnotationsModelValidatorProvider• DataErrorInfoModelValidatorProvider• ClientDataTypeModelValidatorProvider

Multiply Registered Services (cooperative)

Page 11: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

k

• IModelBinderProvider (ModelBinderProviders.BinderProviders)• DefaultControllerFactory

• IViewEngine (ViewEngines.Engines)• WebFormViewEngine• RazorViewEngine

• ValueProviderFactory (ValueProviderFactories.Factories)• ChildActionValueProviderFactory• FormValueProviderFactory• JsonValueProviderFactory• RouteDataValueProviderFactory• QueryStringValueProviderFactory• HttpFileCollectionValueProviderFactory

Multiply Registered Services (competitive)

Page 12: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kDependency Resolver

• Consente di risolvere i problemi di dipendenza

• Concretizzazione del pattern astratto Inversion-of-Control (IoC)

• Permette di incapsulare facilmente uno IoC Container

• Molte implementazioni disponibili su NuGet

Page 13: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kDipendenze e IoC

• Il componente A da passivo (subisce la scelta di B di usare C)...

• ...diventa attivo (impone a B di usare D per svolgere un azione di tipo IC)

ComponenteA

ComponenteB

ServizioC

ComponenteA

ServizioD : IC

ComponenteB

Page 14: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kInversion of Control

Page 15: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kInversion of Control

Page 16: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kService Locator

• Il pattern Service Locator implementa l’astrazione di IoC definendo un componente esterno responsabile della risoluzione delle dipendenze

• Un Service Locator può essere:• Specifico: consente la risoluzione

strongly typed di interfacce ben definite• Generico: fornisce un approccio generico

per la risoluzione di qualunque tipo di dipendenza

Page 17: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kService Locator specifici

Page 18: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kSL specifici: pregi e difetti

• È facile da capire e utilizzare• Consente di personalizzare la

creazione degli oggetti usando parametri

• È limitato alla creazione degli oggetti previsti in fase di design

• Rischia di trasformare la sua manutenzione in un incubo

Page 19: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kService Locator generici

Page 20: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kSL generici: pregi e difetti

• Risolve ogni tipo di dipendenza anche senza conoscere il tipo di oggetto richiesto

• Riduce i costi di manutenzione, non richiedendo la modifica dell’interfaccia

• Non fornisce informazioni qualitative sui servizi che eroga (o che non eroga)

• Non consente di personalizzare la creazione degli oggetti restituiti

Page 21: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kDependency Injection

• Implementazione di IoC basata sulla realizzazione dei componenti in modo tale da consentire un’esplicità indicazione delle dipendenze dall’esterno

• Rispetto a SL consente una trasparenza del codice nettamente maggiore

• Può essere declinata in due varianti:• Constructor Injection• Property Injection

Page 22: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kDI: Constructor Injection

• Forma più comune di Dependency Injection

• Il costruttore del componente specifica esplicitamente tutte le sue dipendenze

• Il componente non deve conoscere i dettagli di funzionamento del Service Locator

• L’utilizzo del componente è chiaro con un semplice sguardo al costruttore

Page 23: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kDI: Property Injection

• Forma meno comune di Dependency Injection

• Le dipendenze possono essere iniettate impostando proprietà apposite

• È meno chiaro che prima di utilizzare un metodo del componente bisogna settare una proprietà

• Consente di specificare dipendenze opzionali• Unica scelta se non si può gestire la

chiamata al costruttore

Page 24: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kDependency Injection Containers

• Entrambi i metodi dicono «cosa» fare ma non «come» farlo: la risposta è nei DI Container

• Sono librerie che agiscono come Factory dei componenti analizzando automaticamente le dipendenze

• Simili nell’aspetto esterno ai SL si prendono però carico anche della creazione dell’oggetto da restituire

Page 25: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

k

demo

Page 26: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kTesting, Unit testing e TDD

• Parte dello sviluppo software che si occupa della verifica delle corrispondenza tra il funzionamento del codice e i requisiti

• Unit testing, integration testing, performance testing, scalability testing

• Consente di migliorare la qualità del proprio codice, ridurre il peso della manutenzione ma anche (TDD) migliorarne il design

Page 27: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kPilastri dello Unit testing

• Testare piccoli frammenti di codice («unit»), tipicamente metodi

• Testare in maniera isolata rispetto al resto dell’applicazione

• Testare i soli endpoint pubblici• Ottenere il risultato

positivo/negativo dei test in maniera automatizzata

Page 28: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kTest Driven Design

• Utilizzare lo Unit testing per guidare lo sviluppo della propria applicazione

• Scrivere il codice strettamente necessario a passare i test

• Red/Green cycle• Utilizzabile sia per i nuovi sviluppi

che per il bug fixing• Attenzione al refactoring!

Page 29: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

kArrange, Act, Assert

• Arrange: predisporre l’ambiente per il test

• Act: effettuare la chiamata al codice oggetto del test

• Assert: verificare che ciò che ci si aspettava si è verificato (e ciò che non ci si aspettava non si è verificato)

• Verificare un comportamente alla volta (single assertion rule)

Page 30: ASP.NET MVC: Andare oltre il 100% (Web@work)

@Web@Wor

k

demo

Page 31: ASP.NET MVC: Andare oltre il 100% (Web@work)

Web@WorkGrazie agli sponsor