Una delle modernità nel design di ASP.NET Core risiede nel suo sistema integrato di dependency injection, che ci permette di disaccoppiare efficacemente i componenti della nostra applicazione.
Infatti, come abbiamo visto in un precedente script (https://www.aspitalia.com/script/1230/Gestire-Ciclo-Vita-Servizi-ASP.NET-Core.aspx), ci è consentito aggiungere servizi e configurarne il ciclo di vita senza dover ricorrere a componenti di terze parti. Microsoft ha scelto di aggiungere un services container minimale ad ASP.NET Core così che tutti gli sviluppatori potessero entrare in contatto con esso e prendere confidenza con la pratica della dependency injection.
Tuttavia, ci sono situazioni in cui desideriamo avvalerci di un services container più evoluto, che abbia funzionalità avanzate come le seguenti:
- Semplificare la configurazione dei servizi organizzandoli in moduli;
- Aggiungere dinamicamente tutti i servizi trovati in un assembly con una sola istruzione;
- Essere notificati della creazione e del rilascio di un servizio.
Grazie al design modulare di ASP.NET Core, il services container predefinito è facilmente sostituibile con uno di terze parti come Autofac, che è uno dei primi a supportare ASP.NET Core e a disporre di una buona documentazione, presente al seguente indirizzo:
http://docs.autofac.org/en/latest/integration/aspnetcore.html
Iniziamo referenziando Autofac con il seguente comando da digitare nella Console di gestione pacchetti di Visual Studio:
Install-Package Autofac.Extensions.DependencyInjection
Ora apriamo Startup.cs ed aggiungiamo le seguenti istruzioni using in cima al file.
using Autofac; using Autofac.Extensions.DependencyInjection;
Quindi modifichiamo il metodo RegisterServices come segue:
//Campo privato per mantenere un riferimento al services container private IContainer autofacContainer; // Modifichiamo il tipo restituito da ConfigureServices in IServiceProvider public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc(); //Iniziamo a configurare il services container var builder = new ContainerBuilder(); //Popoliamolo con i servizi registrati sopra builder.Populate(services); //Possiamo aggiungere altri servizi usano la API avanzata di Autofac builder.RegisterType<SmtpEmailSender>().As<IEmailSender>() .OnActivated(args => { Debug.WriteLine("E' stata creata un'istanza di SmtpEmailSender"); }); //Completiamo restituendo l'istanza del container ad ASP.NET Core this.autofacContainer = builder.Build(); return new AutofacServiceProvider(this.autofacContainer); }
Dal momento che ASP.NET Core unifica le tecnologie MVC e Web API, questa configurazione è sufficiente per impiegare il services container con ogni tipo di Controller della nostra applicazione.
Concludiamo con l'invocare il metodo Dispose del services container nel momento in cui l'applicazione sta per essere arrestata. Modifichiamo così il metodo Configure della classe Startup:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime) { // Rilasciamo il container durante l'arresto dell'applicazione appLifetime.ApplicationStopping.Register( () => this.autofacContainer.Dispose()); // qui altro codice già presente nel metodo }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Triggerare una pipeline su un altro repository di Azure DevOps
Utilizzare Tailwind CSS all'interno di React: primi componenti
Creare alias per tipi generici e tuple in C#
Load test di ASP.NET Core con k6
Usare lo spread operator con i collection initializer in C#
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Utilizzare Model as a Service su Microsoft Azure
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Evitare il flickering dei componenti nel prerender di Blazor 8
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Utilizzare il trigger SQL con le Azure Function
I più letti di oggi
- anche domani dalle 17:30 seguite con noi live #build15 https://aspit.co/build15
- Webcast 'AJAX & ATLAS Overview'
- a #igds il 25 e 26/10 a Milano puoi sviluppare un gioco per #wp8 con @AppCampus. in palio 70.000 Euro: https://aspit.co/apa
- WinJS in Windows Phone 8.1
- la RC di #vs13 è compatibile con #win81 RTM, non con la Preview. l'annuncio ufficiale è su https://aspit.co/any
- Ancora un bug: esce Mono 0.23
- SSL Certificates for everyone on Azure
- Mostrare una MessageBox con un custom control
- disponibile la preview 1 ci #dotnetcore 2.1, #aspnetcore, #efcore. performance, novità e migliorie su https://aspit.co/bmf
- si continua a #netconfit con 'developing modern web apps with #aspnetcore', con il nostro @dbochicchiohttps://aspit.co/netconf-18