asp.net mvc: andare oltre il 100% (web@work)
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
![Page 1: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/1.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/2.jpg)
Web@WorkGrazie agli sponsor
![Page 3: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/3.jpg)
@Web@Wor
kAgenda
• NuGet• Url localization• Dependency Resolver• Unit testing
![Page 4: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/4.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/5.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/6.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/7.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/8.jpg)
@Web@Wor
k
demo
![Page 9: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/9.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/10.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/11.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/12.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/13.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/14.jpg)
@Web@Wor
kInversion of Control
![Page 15: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/15.jpg)
@Web@Wor
kInversion of Control
![Page 16: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/16.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/17.jpg)
@Web@Wor
kService Locator specifici
![Page 18: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/18.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/19.jpg)
@Web@Wor
kService Locator generici
![Page 20: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/20.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/21.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/22.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/23.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/24.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/25.jpg)
@Web@Wor
k
demo
![Page 26: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/26.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/27.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/28.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/29.jpg)
@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)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/30.jpg)
@Web@Wor
k
demo
![Page 31: ASP.NET MVC: Andare oltre il 100% (Web@work)](https://reader033.vdocuments.mx/reader033/viewer/2022061208/548b9792b479595f668b48a0/html5/thumbnails/31.jpg)
Web@WorkGrazie agli sponsor