ASP.NET MVC: Andare oltre il 100% (Web@work)
-
Upload
giorgio-di-nardo -
Category
Technology
-
view
794 -
download
0
description
Transcript of 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
Web@WorkGrazie agli sponsor
@Web@Wor
kAgenda
• NuGet• Url localization• Dependency Resolver• Unit testing
@Web@Wor
kNuGet
Aggiungere un riferimentosenza NuGet
Aggiungere un riferimentocon NuGet
Aggiungere pacchetto
Trovarlo
Scaricarlo
Estrarlo
Referenziarlo
Configurarlo
@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)
@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
@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
@Web@Wor
k
demo
@Web@Wor
k
• IControllerActivator • DefaultControllerActivator
• IControllerFactory (ControllerBuilder.Current.SetControllerFactory)• DefaultControllerFactory
• IViewPageActivator• DefaultViewPageActivator
• ModelMetadataProvider (ModelMetadataProviders.Current)• DataAnnotationsModelMetadataProvider
Singly Registered Services
@Web@Wor
k
• IFilterProvider (FilterProviders.Providers)• FilterAttributeFilterProvider• GlobalFilterCollection• ControllerInstanceFilterProvider
• ModelValidatorProvider (ModelValidatorProviders.Providers)• DataAnnotationsModelValidatorProvider• DataErrorInfoModelValidatorProvider• ClientDataTypeModelValidatorProvider
Multiply Registered Services (cooperative)
@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)
@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
@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
@Web@Wor
kInversion of Control
@Web@Wor
kInversion of Control
@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
@Web@Wor
kService Locator specifici
@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
@Web@Wor
kService Locator generici
@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
@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
@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
@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
@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
@Web@Wor
k
demo
@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
@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
@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!
@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)
@Web@Wor
k
demo
Web@WorkGrazie agli sponsor