L'uscita di ASP.NET Core ha portato a una maggiore diffusione dell'utilizzo della DI (Dependency Injection) ma spesso senza che lo sviluppatore sappia la sua reale utilità o potenzialità.
Dependency Injection, uno dei design pattern della programmazione OOP. Una best-practice dello sviluppo che può portare alla semplificazione del codice scritto, facilitare il disacoppiamento, e migliorare la testabilità.
In questa sessione vedremo cos'è la DI e come utilizzarla intelligentemente all'interno dei nostri progetti.
Slide dell'evento "XE One Day - Good code" tenuto il 15.09.2018.
Il codice è disponibile alla pagina dell'evento https://www.xedotnet.org/eventi/one-day-good-code/
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
Continuous Integration con SQL Server. Come automatizzare i processi di build e di test su database SQL Server. Come includere SQL Server nei processi di Application Lifecycle Management (Database Lifecycle Management).
In ASP.NET Core 3.0 è stato introdotto il supporto a gRPC, una framework altamente performante per fare Remote Procedure Call (RPC). Leggero e molto efficiente, supportato da molti linguaggi, supporto ad una comunicazione bidirezionale, riduzione del consumo di banda...solo questi solo alcuni dei vantaggi che descrivono gRPC, e che durante la sessione cercheremo di capire se siano reali o meno.
Fatto sta che è una tecnologia assolutamente da conoscere e sfruttare nello sviluppo di app moderno, e non solamente in ambito web.
Codice: https://github.com/andreadottor/XE.Dottor.gRPC
Evento: https://www.xedotnet.org/eventi/grpc-and-c-optimising-night/
Windows azure - abbattere tempi e costi di sviluppoAndrea Dottor
In questa sessione vedremo come utilizzare Windows Azure per velocizzare e semplificare la realizzazione di applicazioni ASP.NET. Dallo sviluppo al deploy, passando per lo storage...andremo in dettaglio su varie funzionalità che ci faranno apprezzare ancora più la piattaforma Windows Azure.
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#DotNetCampus
Visto il successo dello scorso anno, anche quest’anno il DotNetCampus ospita un Cert Path dedicato a chi vuole avvicinarsi al mondo delle certificazioni di prodotto e di tecnologia Microsoft. Microsoft, così come altre importanti aziende sul mercato, propone diversi percorsi di certificazione che ognuno può intraprendere, anche in autonomia, per guadagnare competenza e ottenere un riconoscimento. Una certificazione è generalmente un titolo che si ottiene dopo uno o più esami conseguiti con successo in un centro di formazione abilitato. Nel Cert Path vogliamo spiegarvi come affrontare alcuni esami di base per ottenere il titolo di MCP (Microsoft Certified Professional).
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
Continuous Integration con SQL Server. Come automatizzare i processi di build e di test su database SQL Server. Come includere SQL Server nei processi di Application Lifecycle Management (Database Lifecycle Management).
In ASP.NET Core 3.0 è stato introdotto il supporto a gRPC, una framework altamente performante per fare Remote Procedure Call (RPC). Leggero e molto efficiente, supportato da molti linguaggi, supporto ad una comunicazione bidirezionale, riduzione del consumo di banda...solo questi solo alcuni dei vantaggi che descrivono gRPC, e che durante la sessione cercheremo di capire se siano reali o meno.
Fatto sta che è una tecnologia assolutamente da conoscere e sfruttare nello sviluppo di app moderno, e non solamente in ambito web.
Codice: https://github.com/andreadottor/XE.Dottor.gRPC
Evento: https://www.xedotnet.org/eventi/grpc-and-c-optimising-night/
Windows azure - abbattere tempi e costi di sviluppoAndrea Dottor
In questa sessione vedremo come utilizzare Windows Azure per velocizzare e semplificare la realizzazione di applicazioni ASP.NET. Dallo sviluppo al deploy, passando per lo storage...andremo in dettaglio su varie funzionalità che ci faranno apprezzare ancora più la piattaforma Windows Azure.
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#DotNetCampus
Visto il successo dello scorso anno, anche quest’anno il DotNetCampus ospita un Cert Path dedicato a chi vuole avvicinarsi al mondo delle certificazioni di prodotto e di tecnologia Microsoft. Microsoft, così come altre importanti aziende sul mercato, propone diversi percorsi di certificazione che ognuno può intraprendere, anche in autonomia, per guadagnare competenza e ottenere un riconoscimento. Una certificazione è generalmente un titolo che si ottiene dopo uno o più esami conseguiti con successo in un centro di formazione abilitato. Nel Cert Path vogliamo spiegarvi come affrontare alcuni esami di base per ottenere il titolo di MCP (Microsoft Certified Professional).
Sessione per NetCampus 2015. La diffusione sempre più ampia di applicazioni sviluppate interamente in HTML5 e JS richiede l'adozione di processi di automazione per la fase di build, testing e rilascio. In questa sessione vedremo quali sono i principali strumenti a nostra disposizione per semplificare queste fasi dello sviluppo.
Async: scalabilità e responsiveness senza pari! @ CDaysMatteo Baglini
Per ottenere applicazioni scalabili con un consumo minimo di risorse e una UI sempre reattiva,
dobbiamo scrivere software che opera in maniera asincrona.
In questa sessione vedremo perchè è importante sfruttare questo tipo di programmazione e
quali strumenti mette a disposizione il .NET Framework.
http://www.communitydays.it/events/communitydays-2013/misc04/
Prepariamoci al cambiamento. ASP.NET MVC e ASP.NET Web API saranno unificati in un unico framework chiamato ASP.NET MVC 6, e questo è solo la prima di una serie di novità che stanno per arrivare.
Tutto si semplifica. Le performance migliorano. Un altro salto tecnologico in avanti portato da ASP.NET 5.
In questa sessione, infatti, vedremo tutte le novità che ASP.NET MVC 6 porta con se, e cercheremo di andare in dettaglio in modo da capire cosa voglia dire realizzare (da zero) o migrare (un'applicazione essitente) a questa nuova versione
Xamarin.Forms is a framework for building cross-platform applications that share most of the UI codebase among the UWP, iOS and Android platforms. Due to the higher level of abstraction compared to Xamarin.Native, Xamarin.Forms applications may suffer from memory leaks and slow rendering times at the expense of the final user experience. In the session, we will explore the mechanisms used by Xamarin.Forms to translate abstract UI components into native ones, highlight with demos what are the main bottlenecks met by developer, how to solve them and get close to native performances.
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaAndrea Dottor
Sfrutta le tue abilità come sviluppatore web per creare app mobile per Windows Phone, iOS ed Android utilizzando una unica code-base (composta da codice HTML, CSS e JavaScript) e lavora direttamente in Visual Studio. Questo è ora possibile grazie all'estensione "Multi-Device Hybrid Apps for Visual Studio" ed all'uso di Apache Cordova. Un unico IDE ed un singolo progetto per sviluppare per le più diffuse piattaforme mobile.
In questa sessione scopriremo i vantaggi di questa combinazione e daremo risposta ad alcune domande: Quali vantaggi abbiamo dall'utilizzare Visual Studio? Perchè e quando sviluppare un'app ibrida? ...
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!DotNetCampus
AppStudio e' un ambiente RAD web based per lo sviluppo di Universal App (Windows Phone 8.1 e Windows 8.1) per la visualizzazioni di sorgenti dati. In questa sessione vedremo come sia facile realizzare da zero un'app che acceda a sorgenti remote e come sia, infine, possibile personalizzare il codice sorgente per poter implementare le proprie personalizzazioni.
Sessione per NetCampus 2015. La diffusione sempre più ampia di applicazioni sviluppate interamente in HTML5 e JS richiede l'adozione di processi di automazione per la fase di build, testing e rilascio. In questa sessione vedremo quali sono i principali strumenti a nostra disposizione per semplificare queste fasi dello sviluppo.
Async: scalabilità e responsiveness senza pari! @ CDaysMatteo Baglini
Per ottenere applicazioni scalabili con un consumo minimo di risorse e una UI sempre reattiva,
dobbiamo scrivere software che opera in maniera asincrona.
In questa sessione vedremo perchè è importante sfruttare questo tipo di programmazione e
quali strumenti mette a disposizione il .NET Framework.
http://www.communitydays.it/events/communitydays-2013/misc04/
Prepariamoci al cambiamento. ASP.NET MVC e ASP.NET Web API saranno unificati in un unico framework chiamato ASP.NET MVC 6, e questo è solo la prima di una serie di novità che stanno per arrivare.
Tutto si semplifica. Le performance migliorano. Un altro salto tecnologico in avanti portato da ASP.NET 5.
In questa sessione, infatti, vedremo tutte le novità che ASP.NET MVC 6 porta con se, e cercheremo di andare in dettaglio in modo da capire cosa voglia dire realizzare (da zero) o migrare (un'applicazione essitente) a questa nuova versione
Xamarin.Forms is a framework for building cross-platform applications that share most of the UI codebase among the UWP, iOS and Android platforms. Due to the higher level of abstraction compared to Xamarin.Native, Xamarin.Forms applications may suffer from memory leaks and slow rendering times at the expense of the final user experience. In the session, we will explore the mechanisms used by Xamarin.Forms to translate abstract UI components into native ones, highlight with demos what are the main bottlenecks met by developer, how to solve them and get close to native performances.
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaAndrea Dottor
Sfrutta le tue abilità come sviluppatore web per creare app mobile per Windows Phone, iOS ed Android utilizzando una unica code-base (composta da codice HTML, CSS e JavaScript) e lavora direttamente in Visual Studio. Questo è ora possibile grazie all'estensione "Multi-Device Hybrid Apps for Visual Studio" ed all'uso di Apache Cordova. Un unico IDE ed un singolo progetto per sviluppare per le più diffuse piattaforme mobile.
In questa sessione scopriremo i vantaggi di questa combinazione e daremo risposta ad alcune domande: Quali vantaggi abbiamo dall'utilizzare Visual Studio? Perchè e quando sviluppare un'app ibrida? ...
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!DotNetCampus
AppStudio e' un ambiente RAD web based per lo sviluppo di Universal App (Windows Phone 8.1 e Windows 8.1) per la visualizzazioni di sorgenti dati. In questa sessione vedremo come sia facile realizzare da zero un'app che acceda a sorgenti remote e come sia, infine, possibile personalizzare il codice sorgente per poter implementare le proprie personalizzazioni.
In questa sessione andremo in dettaglio sul come poter migliorare le nostre applicazioni ASP.NET dal punto delle vista delle performance: Come capire dove interventire? Cosa possiamo migliorare? A cosa dobbiamo prestare attenzione? E nel caso di un'applicazione esistente, dove possiamo intervenire per migliorarla ulteriormente?
Una panoramica delle caratteristiche e delle possibilità che hanno reso Angular uno dei framework più importanti sulla scena frontend.
N.B. Le slides sono aggiornate sino ad Angular 6.
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftStefano Benedetti
Il pattern architetturale MVC (Model View Controller) favorisce la manutenzione delle applicazioni web tramite una architettura elegante ed una chiara ed esplicita separazione delle competenze, l'impiego dei più diffusi pattern di software engineering, il controllo completo dell'HTML generato e degli URL, la testabilità ed estendibilità.
In questa sessione vedremo le novità principali di Asp.Net MVC in versione 3.
La sessione è stata tenuta a SMAU Business Bologna il 9 giugno 2011
Slide della sessione tenuta alla Blazor Conf 2022 (https://blazorconf.it/)
Sono convinto che uno sviluppatore Blazor debba conoscere JavaScript in quanto molte librerie (d'uso comune) non le troviamo disponibili su NuGet. Interagire con Google Maps, visualizzare dei grafici, utilizzare API del browser, ... In questa sessione vedremo come far dialogare questi due mondi che sono molto più vicini e lagati di quello che si pensa, ed il tutto con una serie di esempi pratici (e reali).
Stanco delle solite sessioni introduttive o generiche su blazor? Bene, questa è la serata che fa per te.
In questa sessione ho raccolto una serie di argomenti, problematiche e tips derivanti da due anni di utilizzo di Blazor (praticamente dal suo lancio). Casi reali affrontanti e risolti.
E come nel (ormai) classico format online di XE, ci sarà ampio spazio per le domande ed il confronto.
Dal RenderFragment ai Generics, tips for Blazor developersAndrea Dottor
Sessione tenuta alla Blazor Conference 2021 del 13.04.2021.
(https://www.aspitalia.com/eventi/87/Blazor-Conference-2021-Online.aspx)
Una sessione dove verranno presentati una serie di tips per migliorare e facilitare la scrittura delle nostre applicazioni: da codice html dinamico, al miglioramento ed organizzazione dello stesso. Il tutto per poter sfruttare ogni bit che Blazor può dare. Dal RenderFragment ai Generics. Consigli che arrivano da esperienze reali
Codice: https://github.com/andreadottor/XE.Dottor.Demo.BlazorWebApp
In questa sessione vedremo come uno sviluppatore WebForm possa essere velocemente produttivo (utilizzando le ultime versioni di ASP.NET Core) grazie a Blazor. Vedremo quindi cosa differenza un'applicazione ASP.NET Core, rispetto a quelle WebForm (.NET Framework) fino ad arrivare a comprendere perchè e come Blazor possa agevolare questa transizione.
Quindi una sessione non solo per chi è nuovo a Blazor, ma anche perchì ancora non ha migrato ad ASP.NET Core.
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Andrea Dottor
In questa sessione scopriremo come utilizzare al meglio di Health Check, funzionalità che è stata introdotta in ASP.NET ancora dalla versione 2.2, ma che poche applicazioni sfruttano.
Uno strumento davvero utile anche per un primo debug, o per una semplice verifica dello stato delle nostre applicazioni...e non solo per chi utilizza container e orchestratori.
Cosa ci permettono di sapere gli Health Check?
Come possiamo essere notificati se qualcosa non va nel verso giusto?
A queste e ad altre domande daremo risposta nel corso della sessione
In questa serata cercheremo di capire perchè Blazor ha riscosso così tanto successo, e lo faremo analizzando casi presi da applicazioni reali dove questa tecnologia è stata introdotta, così da capirne meglio le potenzialità (ma anche le eventuali criticità).
Come di consuetudine, faremo poi un confronto, così da condividere i vari punti di vista.
In questa sessione andremo in dettaglio sulle principali novità introdotte nella versione 3.0 di ASP.NET Core.
Code: https://github.com/andreadottor/VSSaturdayPN2019
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Andrea Dottor
Molte applicazione sono (ancora) sviluppate in WebForm e non possono essere convertite automaticamente ad ASP.NET Core. Una riscrittura completa in molti casi è impossibile o impensabile da attuare. In questa sessione vedremo come migrare in modo graduale queste tipologie di applicazioni verso ASP.NET Core, andando in dettaglio nelle varie problematiche che solitamente si possono presentare. La sessione deriva da un'esperienza reale, che ha permesso di conoscere (nel bene o nel male) le difficoltà che si nascondo in queste migrazioni.
Evento: https://www.xedotnet.org/eventi/one-day-enterprise-application/
Real case: migrate from Web Forms to ASP.NET Core graduallyAndrea Dottor
Many application are developed in Web Forms and cannot be automatically converted to ASP.NET Core. Wait for rewrite all application in many case are impossible.
In this session are explained a way to gradually migrate to the new tecnology, and all the tricks for run the applications side by side (during the migration). And only when all are complete, dismiss the old. A real world case.
Non stiamo parlando di un ritorno a WebForm ma di un'evoluzione (o meglio) di un'alternativa al pattern MVC. Le Razor Pages possono essere un buon motore per smuovere le migrazioni di vecchie applicazioni, utilizzando un paradigma di pagina (vicino a quello che chi utilizza WebForm già conosce) ma con una visione e pulizia degna delle migliori applicazioni MVC .
Ecco che le Razor Pages si stanno ritagliano il loro spazio, ed in questa sessione cercheremo di affrontare i pro e contro del loro utilizzo, capendone al meglio i casi duso ideali.
Slide dell'evento One Day Cache (http://www.xedotnet.org/eventi/one-day-performance-optimization/)
ABSTRACT: Cache, amica e nemica di molti dev.
Uno dei modi per incrementare le performance di un'applicativo è l'utilizzo della cache, ma non è tutto oro quel che luccica.
In questa sessione vedremo quali tipologie di cache esistono, ed il come poterle utilizzare al meglio. Output cache, cache applicativa, Redis, Memcached...cerchiamo di fare un pò di chiarezza e capiamo i pro e contro delle varie soluzioni.
ASP.NET Core 2.0 è stato ufficialmente rilasciato e porta con se parecchie novità come le Razor Pages, template aggiornati e l'integrazione con Application Insights migliorata. In questa cercheremo capiremo la vera maturità di questo framework, e quanto questo rilascio sia importante per noi dev.
This document discusses ASP.NET Core vs Node.JS. It provides an overview of ASP.NET Core including its unified story for building web UI and APIs, integration of modern client-side frameworks, environment-based configuration, built-in dependency injection, modular request pipeline, and ability to host on IIS or self-host. It notes ASP.NET Core is built on .NET Core and ships as NuGet packages. The document also mentions new ASP.NET Core tooling, ability to build cross-platform apps for Windows, Mac and Linux, and open source focus. It provides links to code and slides and discusses ASP.NET Core and Visual Studio 2017 release timing and features like JavaScript services.
Sessione tenuto presso la fiera "Punto di incontro" di Pordenone in data 03.11.2016
"L’evoluzione del web. Andrea Dottor, consulente informatico,
Microsoft MVP e docente ITS, illustra il percorso di
studi dando spazio ad alcune tecnologie/framework come
AngularJS e Bootstrap, spiegando perché saranno alla
base delle applicazioni del futuro."
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
Cerchiamo di capire cosa vuol dire creare delle API pubbliche. Cerchiamo di capire cosa offre ad oggi ASP.NET, e come utilizzare al meglio la tecnologia. L'intenzione è di andare in dettaglio su problematiche spesso sottovalutate: serve sempre ASP.NET Web API? E' meglio WCF? Quali problematiche possono capitare? Come faccio il versionamento? Quali oggetti/classi espongo? E la documentazione?
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webAndrea Dottor
Una sessione alla scoperta delle grandi novità che ASP.NET 5 introduce. Questo nuovo aggiornamento del framework non porta solo un'evoluzione alla tecnologia che già conosciamo, ma porta importanti e radicali cambiamenti (una "rivoluzione" di molte cose che già conosciamo e utilizziamo) che dobbiamo essere pronti a sfruttare il prima possibile per dare una marcia in più alle nostre applicazioni. ASP.NET MVC 6, nuovo template di progetto, cross-platform.
2. Dependency injection (DI) è un design pattern della programmazione
orientata agli oggetti il cui scopo è quello di semplificare lo sviluppo e migliorare
la testabilità di software di grandi dimensioni.
Per utilizzare tale design pattern è sufficiente dichiarare le dipendenze che un
componente necessita (dette anche interface contracts). Quando il componente
verrà istanziato, un iniettore si prenderà carico di risolvere le dipendenze
(attuando dunque l'inversione del controllo). Se è la prima volta che si tenta di
risolvere una dipendenza l'injector istanzierà il componente dipendente, lo
salverà in un contenitore di istanze e lo restituirà. Se non è la prima volta, allora
restituirà la copia salvata nel contenitore. Una volta risolte tutte le dipendenze, il
controllo può tornare al componente applicativo.
Il pattern Dependency Injection coinvolge almeno tre elementi:
• una componente dipendente,
• la dichiarazione delle dipendenze del componente, definite come interface
contracts,
• un injector (chiamato anche provider o container) che crea, a richiesta, le
istanze delle classi che implementano delle dependency interfaces.
15/09/2018 2
Dependency injection pattern
(fonte: https://en.wikipedia.org/wiki/Dependency_injection)
3. Dependency injection (DI) è un design pattern della programmazione
orientata agli oggetti il cui scopo è quello di semplificare lo sviluppo e migliorare
la testabilità di software di grandi dimensioni.
Per utilizzare tale design pattern è sufficiente dichiarare le dipendenze che
un componente necessita (dette anche interface contracts). Quando il
componente verrà istanziato, un iniettore si prenderà carico di risolvere le
dipendenze (attuando dunque l'inversione del controllo). Se è la prima volta
che si tenta di risolvere una dipendenza l'injector istanzierà il componente
dipendente, lo salverà in un contenitore di istanze e lo restituirà. Se non è la
prima volta, allora restituirà la copia salvata nel contenitore. Una volta risolte
tutte le dipendenze, il controllo può tornare al componente applicativo.
Il pattern Dependency Injection coinvolge almeno tre elementi:
• una componente dipendente,
• la dichiarazione delle dipendenze del componente, definite come interface
contracts,
• un injector (chiamato anche provider o container) che crea, a richiesta, le
istanze delle classi che implementano delle dependency interfaces.
15/09/2018 3
Dependency injection pattern
(fonte: https://en.wikipedia.org/wiki/Dependency_injection)
4. • https://deviq.com/inversion-of-control/
• Inversion of Control (IoC or IOC) describes a system
that follows the Hollywood Principle ( “Don’t Call Us,
We’ll Call You.” ). That is, flow of control within the
application is not controlled by the application itself, but
rather by the underlying framework. Typically in such an
architecture, the application is written such that it ties
into the application framework by handling framework
events or plugging in to framework extension points.
• An IOC Container, also known as a Dependency
Inversion (DI) container, is a specialized factory used to
facilitate dependency injection.
15/09/2018 4
Inversion of Control
5. public class HomeController : Controller
{
private readonly SqlDataAccess _dataAccess;
public HomeController()
{
var connectionString = ConfigurationManager.ConnectionStrings["xe"].ConnectionString;
this._dataAccess = new SqlDataAccess(connectionString);
}
public IActionResult Index()
{
var speakers = this._dataAccess.GetSpeakers();
return View(speakers);
}
}
15/09/2018 5
Prima
6. public class HomeController : Controller
{
private readonly IDataAccess _dataAccess;
public HomeController(IDataAccess dataAccess)
{
this._dataAccess = dataAccess;
}
public IActionResult Index()
{
var speakers = this._dataAccess.GetSpeakers();
return View(speakers);
}
}
15/09/2018 6
Dopo
7. Riduzione delle dipendenze (dirette)
il codice non è legato ad una precisa implementazione di
una sua dipendenza, ma (solitamente) ad un'interfaccia,
favorendo così il disaccoppiamento
Codice più riutilizzabile
riducendo le dipendenze si facilita il riuso del codice in
contesti diversi
Codice più testabile
dipendendo da un'interfaccia, si è facilitati nella scrittura di
test, potendo iniettare dei mock/stub/fake delle
dipendenze
Codice più leggibile
si viene portati a scrivere classi focalizzate a risolvere il
singolo problema, semplificando di molto la scrittura e la
lettura del codice
15/09/2018 7
Dependency Injection Benefits
8. ASP.NET Core nasce con un proprio engine di Dependency
Injection
Utilizzato per iniettare tutti i service/factory necessari al
funzionamento di ASP.NET Core ed Entity Framework Core
Non si tratta di un'implementazione evoluta, ma espone
funzionalità che sono sufficienti alla maggioranza delle
applicazioni
15/09/2018 8
ASP.NET Core Dependency Injection
10. Le dipendenze/servizi possono venire create (e distrutte)
in base a regole definite nel DI Container.
Il DI Container si occupa di tenere traccia e risolvere le
dipendenze.
• Se un servizio ha a sua volta delle dipendenze, queste
vengono gestite a loro volta dal DI container.
• Se un servizio implementa IDisposable, il metodo
Dispose verrà chiamato automaticamente.
15/09/2018 10
Service Life Times
12. Scoped
La dipendenza viene create per "scope".
In un'applicazione web lo scope è la singola richiesta http.
15/09/2018 12
Service Life Times - Scoped
13. Singleton
La dipendenza viene creata la prima volta che viene
richiesta. Tutte le volte successive viene ritornata sempre
(e solo) l'istanza già creata.
15/09/2018 13
Service Life Times - Singleton
14. Le dipendenze vengono iniettate tramite il costruttore
della classe/controller/handler/…
15/09/2018 14
Constructor Injection
public class IndexModel : PageModel
{
private readonly IMyDependency _myDependency;
public IndexModel(IMyDependency myDependency)
{
_myDependency = myDependency;
}
public async Task OnGetAsync()
{
await _myDependency.WriteMessage("IndexModel.OnGetAsync created this message.");
}
}
15. Utilizzando l'attributo [FromService] prima di un
argomento di un metodo, fa si che questo venga
recuperato dal DI Container
Utile quando il servizio/dipendenza viene utilizzato da un
solo metodo del controller e si vuole evitare di farlo
risolvere ad ogni richiesta tramite dipendeza nel
costruttore
15/09/2018 15
Action Injection with FromServices
public IActionResult About([FromServices] IDateTime dateTime)
{
ViewData["Message"] = "Currently on the server the time is " + dateTime.Now;
return View();
}
16. In ASP.NET Core la DI funziona anche a livello di View,
dando la possibilità di iniettare direttamente le
dipendenze tramite la keyword @inject
15/09/2018 16
DI nelle View
@using System.Threading.Tasks
@using ViewInjectSample.Model
@using ViewInjectSample.Model.Services
@model IEnumerable<ToDoItem>
@inject StatisticsService StatsService
<div>
<p>Total Items: @StatsService.GetCount()</p>
<p>Completed: @StatsService.GetCompletedCount()</p>
<p>Avg. Priority: @StatsService.GetAveragePriority()</p>
</div>
17. Possibilità di iniettare le dipendenze tramite proprietà
delle classi
Viene considerata come pratica da evitare in quanto
causa una problematica "Temporal Coupling"
• http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/
ASP.NET Core non supporta direttamente la property
injection, ma è possibile utilizzarla sfruttando altri DI
Container.
15/09/2018 17
Property Injection
public class ValuesController : Controller
{
public IFooService FooService { get; set; }
[HttpGet]
public IActionResult Get()
{
// use FooService here
}
}
19. Esistono già delle implementazioni di terze parte che possono
andare a sostituire quella di default di ASP.NET Core:
• Autofac
• DryIoc
• Grace
• LightInject
• StructureMap
• Stashbox
• Unity
Utilizzo di altri DI container con
Microsoft.Extensions.DependencyInjection
15/09/2018 19
20. The Unity Container (Unity) is a lightweight, extensible
dependency injection container with optional support for
instance and type interception.
• https://github.com/unitycontainer/unity/
Registrazione delle dipendenze
Recupero di una dipendenza
Definizione di dipendenze nel file di configurazione
15/09/2018 20
Unity Container (Unity)
var container = new UnityContainer();
container.RegisterType<IDataAccess, SQLDataAccess>();
IDBAccess data = container.Resolve<IDataAccess>();
var container = new UnityContainer();
var section =(UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(container);
21. Autofac is an addictive Inversion of Control container for
.NET Core, ASP.NET Core, .NET 4.5.1+, Universal
Windows apps, and more.
• https://autofac.org/
15/09/2018 21
Autofac
var builder = new ContainerBuilder();
// Register individual components
builder.RegisterInstance(new TaskRepository()).As<ITaskRepository>();
builder.RegisterType<TaskController>();
builder.Register(c => new LogManager(DateTime.Now)).As<ILogger>();
// Scan an assembly for components
builder.RegisterAssemblyTypes(myAssembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
var container = builder.Build();
23. A partire dal .NET Framework 4.7.2 viene facilitato l'utilizzo della
Dependency Injection, anche se non al livello di ASP.NET MVC
• Annuncio del 30 Aprile 2018 - [ASP.NET] Support for ASP.NET
Dependency Injection
• "Support setter-based, interface-based and constructor-based
injection in web application project in Handler, Module, Page, User
control and Custom control."
• "Support setter-based and interface-based injection in web site
project in Handler, Module, Page, User controls and Custom controls."
• "Extensebility to support different dependency injection frameworks."
• Step1 - Implementare IServiceProvider
• Step2 - Valorizzare HttpRuntime.WebObjectActivator nel
Global.asax
15/09/2018 23
Utilizzare la DI in applicazioni WebForms
24. Su nuget è presente un package per avere la DI utilizzando
Unity senza doversi occupare di implementare manualmente
IServiveProvider
Install-Package Microsoft.AspNet.WebFormsDependencyInjection.Unity
15/09/2018 24
Microsoft.AspNet.WebFormsDependencyInjection.Unity
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
var container = this.AddUnity();
container.RegisterType<IPopularMovie, MovieManager>();
container.RegisterType<IMovieRepository, XmlMovieRepository>();
}
}
25. Si può utilizzare la DI anche in applicazioni che
utilizzando una versione del .NET Framework precedente
alla versione 4.7.2
Per iniettare le dipendenze si può creare (o utilizzare)
degli HttpModules, oppure una custom Factory che si
occupi di gestire le estensioni aspx
Si può utilizzare il pattern Service Locator per farsi dare
manualmente le dipendenze
15/09/2018 26
Utilizzare la DI in applicazioni WebForms
28. • Dependency injection in ASP.NET Core
• ASP.NET Core Dependency Injection Best Practices, Tips & Tricks
• Dependency Injection Benefits
• Use Dependency Injection In WebForms Application
• Using ASP.Net Webform Dependency Injection with .NET 4.7.2
• Announcing the .NET Framework 4.7.2
Links
15/09/2018 29