SlideShare uma empresa Scribd logo
1 de 30
Baixar para ler offline
www.xedotnet.org
Andrea Dottor
@dottor
Dependency Injection
questa sconosciuta
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)
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)
• 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
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
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
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
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
Service Type Lifetime
Microsoft.AspNetCore.Hosting.Builder.IApplicationBuilderFactory Transient
Microsoft.AspNetCore.Hosting.IApplicationLifetime Singleton
Microsoft.AspNetCore.Hosting.IHostingEnvironment Singleton
Microsoft.AspNetCore.Hosting.IStartup Singleton
Microsoft.AspNetCore.Hosting.IStartupFilter Transient
Microsoft.AspNetCore.Hosting.Server.IServer Singleton
Microsoft.AspNetCore.Http.IHttpContextFactory Transient
Microsoft.Extensions.Logging.ILogger<T> Singleton
Microsoft.Extensions.Logging.ILoggerFactory Singleton
Microsoft.Extensions.ObjectPool.ObjectPoolProvider Singleton
Microsoft.Extensions.Options.IConfigureOptions<T> Transient
Microsoft.Extensions.Options.IOptions<T> Singleton
System.Diagnostics.DiagnosticSource Singleton
System.Diagnostics.DiagnosticListener Singleton
15/09/2018 9
ASP.NET Core Framework-provided services
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
Transient
La dipendenza viene creata ogni volta che viene richiesta
15/09/2018 11
Service Life Times - Transient
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
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
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.");
}
}
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();
}
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>
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
}
}
DEMO
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
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);
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();
DEMO
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
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>();
}
}
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
DEMO
15/09/2018 28
Quando non è consigliato utilizzare DI
• 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
15/09/2018 30
Thanks
15/09/2018 31
www.dottor.net
andrea@dottor.net
@dottor
Andrea Dottor
Microsoft MVP Developer Technologies
Contatti

Mais conteúdo relacionado

Mais procurados

Dot netcampus2015 green-template
Dot netcampus2015 green-templateDot netcampus2015 green-template
Dot netcampus2015 green-templateDotNetCampus
 
Architetttura Della Soluzione
Architetttura Della SoluzioneArchitetttura Della Soluzione
Architetttura Della SoluzioneLuca Milan
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationAntonio Liccardi
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Manuel Scapolan
 
Async: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDaysAsync: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDaysMatteo Baglini
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroAndrea Dottor
 
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuerySandro Marcon
 
Soluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie MicrosoftSoluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie MicrosoftMassimo Bonanni
 
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...Codemotion
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP WayLuca Milan
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campusDotNetCampus
 
ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%DomusDotNet
 
Multi-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaMulti-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaAndrea Dottor
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web AppsAndrea Dottor
 
Costruisci il tuo device
Costruisci il tuo deviceCostruisci il tuo device
Costruisci il tuo deviceDotNetCampus
 
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!DotNetCampus
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiAndrea Dottor
 

Mais procurados (20)

Dot netcampus2015 green-template
Dot netcampus2015 green-templateDot netcampus2015 green-template
Dot netcampus2015 green-template
 
Wcf data services
Wcf data servicesWcf data services
Wcf data services
 
Architetttura Della Soluzione
Architetttura Della SoluzioneArchitetttura Della Soluzione
Architetttura Della Soluzione
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)
 
Async: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDaysAsync: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDays
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuro
 
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuery
 
Soluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie MicrosoftSoluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie Microsoft
 
Akka.net & Actor Model
Akka.net & Actor ModelAkka.net & Actor Model
Akka.net & Actor Model
 
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
Xamarin.Forms Performance Tips & Tricks - Francesco Bonacci - Codemotion Rome...
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP Way
 
jQuery
jQueryjQuery
jQuery
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campus
 
ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%
 
Multi-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache CordovaMulti-Device Hybrid Apps con Visual Studio e Apache Cordova
Multi-Device Hybrid Apps con Visual Studio e Apache Cordova
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web Apps
 
Costruisci il tuo device
Costruisci il tuo deviceCostruisci il tuo device
Costruisci il tuo device
 
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivati
 

Semelhante a Dependency injection questa sconosciuta

Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAndrea Balducci
 
ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimizationAndrea Dottor
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angulardotnetcode
 
Spring Framework
Spring FrameworkSpring Framework
Spring FrameworkNaLUG
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTfirenze-gtug
 
Jakarta Struts
Jakarta StrutsJakarta Struts
Jakarta Strutsjgiudici
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular OverviewFrancesco Sciuti
 
Adobe TechConnection: Flex Best Practices
Adobe TechConnection: Flex Best PracticesAdobe TechConnection: Flex Best Practices
Adobe TechConnection: Flex Best Practicesmarcocasario
 
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftStefano Benedetti
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8Valerio Radice
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven DesignAndrea Saltarello
 

Semelhante a Dependency injection questa sconosciuta (20)

Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
 
ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimization
 
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angular
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
AngularJS-Intro
AngularJS-IntroAngularJS-Intro
AngularJS-Intro
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWT
 
MVC and Struts 1
MVC and Struts 1MVC and Struts 1
MVC and Struts 1
 
Jakarta Struts
Jakarta StrutsJakarta Struts
Jakarta Struts
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular Overview
 
Adobe TechConnection: Flex Best Practices
Adobe TechConnection: Flex Best PracticesAdobe TechConnection: Flex Best Practices
Adobe TechConnection: Flex Best Practices
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
 
Spring Intro
Spring IntroSpring Intro
Spring Intro
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven Design
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 

Mais de Andrea Dottor

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScriptAndrea Dottor
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...Andrea Dottor
 
Dal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersDal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersAndrea Dottor
 
Blazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormBlazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormAndrea Dottor
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Andrea Dottor
 
Blazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiBlazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiAndrea Dottor
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3Andrea Dottor
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Andrea Dottor
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyAndrea Dottor
 
ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesAndrea Dottor
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingAndrea Dottor
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheAndrea Dottor
 
Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Andrea Dottor
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App ServiceAndrea Dottor
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del webAndrea Dottor
 
Introduzione ad ASP.NET Core
Introduzione ad ASP.NET CoreIntroduzione ad ASP.NET Core
Introduzione ad ASP.NET CoreAndrea Dottor
 
Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniCreare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webAndrea Dottor
 

Mais de Andrea Dottor (20)

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScript
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...
 
Dal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersDal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developers
 
Blazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormBlazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web Form
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
 
Blazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiBlazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi reali
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core gradually
 
ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor Pages
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffolding
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cache
 
Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App Service
 
ASP.NET Core
ASP.NET CoreASP.NET Core
ASP.NET Core
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del web
 
Introduzione ad ASP.NET Core
Introduzione ad ASP.NET CoreIntroduzione ad ASP.NET Core
Introduzione ad ASP.NET Core
 
Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniCreare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del webASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
ASP.NET 4.6 e ASP.NET 5...l'evoluzione del web
 

Dependency injection questa sconosciuta

  • 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
  • 9. Service Type Lifetime Microsoft.AspNetCore.Hosting.Builder.IApplicationBuilderFactory Transient Microsoft.AspNetCore.Hosting.IApplicationLifetime Singleton Microsoft.AspNetCore.Hosting.IHostingEnvironment Singleton Microsoft.AspNetCore.Hosting.IStartup Singleton Microsoft.AspNetCore.Hosting.IStartupFilter Transient Microsoft.AspNetCore.Hosting.Server.IServer Singleton Microsoft.AspNetCore.Http.IHttpContextFactory Transient Microsoft.Extensions.Logging.ILogger<T> Singleton Microsoft.Extensions.Logging.ILoggerFactory Singleton Microsoft.Extensions.ObjectPool.ObjectPoolProvider Singleton Microsoft.Extensions.Options.IConfigureOptions<T> Transient Microsoft.Extensions.Options.IOptions<T> Singleton System.Diagnostics.DiagnosticSource Singleton System.Diagnostics.DiagnosticListener Singleton 15/09/2018 9 ASP.NET Core Framework-provided services
  • 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
  • 11. Transient La dipendenza viene creata ogni volta che viene richiesta 15/09/2018 11 Service Life Times - Transient
  • 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 } }
  • 18. DEMO
  • 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();
  • 22. DEMO
  • 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
  • 26. DEMO
  • 27. 15/09/2018 28 Quando non è consigliato utilizzare DI
  • 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