L'uscita della versione 2 del runtime delle Azure Function rappresenta un passo molto importante perché sposta tutta l'implementazione su ASP.NET Core 2.1 rendendo lo startup e l'intera infrastruttura più leggera. Di conseguenza anche il nostro codice si basa su questo runtime e sulle librerie messe a disposizione da ASP.NET Core.
Negli script precedenti #138, #110 e #101 abbiamo visto come possiamo sfruttare manualmente le librerie di dependency injection per usufruire del motore IoC di .NET Core anche nelle function e leggere quindi la configurazione o ottenere istanze di oggetti registrati.
Di recente però è stata aggiunta la possibilità di sfruttare tutto questo nativamente, integrandoci con il motore IoC utilizzato dal runtime stesso delle function. E' sufficiente prima di tutto installare il pacchetto NuGet Microsoft.Azure.Functions.Extensions sincerandoci di aver anche aggiornato il pacchetto Microsoft.NET.Sdk.Functions ad almeno la versione 1.0.28.
dotnet add package Microsoft.NET.Sdk.Functions --version 1.0.28 dotnet add package Microsoft.Azure.Functions.Extensions
In quest'ultimo pacchetto è presente una classe base FunctionsStartup dalla quale possiamo ereditare ed implementare il metodo Configure, allo stesso modo di come facciamo con ASP.NET Core.
[assembly: FunctionsStartup(typeof(Startup))]
namespace MyFunctions
{
class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddScoped<MyDbContext>();
}
}In questa fase possiamo configurare servizi singleton, transient o scoped. Per quest'ultimo lo scope è nuovo per ogni nuova invocazione di una funzione. Da notare, inoltre, l'uso dell'attributo omonimo FunctionsStartup per indicare la classe da registrare e da avviare insieme a tutto il runtime. Questo attributo in realtà sfrutta una funzionalità già presente nel SDK base che ci permette di intercettare l'avvio delle funzioni implementando l'interfaccia IWebJobsStartup. Con questo ulteriore pacchetto ci viene reso più semplice agganciarci allo startup.
A questo punto non ci resta che preparare la nostra funzione per ricevere le nostre dipendenze. Lo possiamo fare tramite constructor injection oppure passando tramite un'istanza di IServiceProvider, come nell'esempio seguente.
public class MyFunction
{
private readonly MyDbContext _context;
private readonly IConfiguration _configuration;
private readonly IServiceProvider _serviceProvider;
public MyFunction(MyDbContext context, IConfiguration configuration, IServiceProvider serviceProvider)
{
_context = context;
_configuration = configuration;
_serviceProvider = serviceProvider;
}
[FunctionName("MyFunction")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
ILogger log)
{
// Alternativa per ottenere l'istanza
var myDbContext = _serviceProvider.GetRequiredService<MyDbContext>();
return new OkResult();
}
}Nel codice possiamo vedere che siamo in grado anche di chiedere istanze di oggetti registrati dal runtime stesso, come la configurazione generale. E' opportuno prestare attenzione a non esagerare nel numero delle dipendenze registrate come singleton e nel numero di dipendenze che chiediamo se poi queste non vengono richiamate. Purtroppo, attualmente non è supportata l'injection direttamente come parametro della funzione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Validare form con pseudo-classi CSS user-valid e user-invalid
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance
Ottimizzare i costi con Smart tier in Azure Blob Storage
Interazione con ReconnectModal in Blazor
Ottimizzare le API in ASP.NET con Feature Flags
Building Custom Developer Agents
Utilizzare il top layer in HTML
Importare un servizio esterno in .NET Aspire
Validare i dati di una colonna JSON in SQL Server
Integrare OpenTelemetry direttamente in Azure Monitor
Cambiamenti in OpenAPI per la documentazione di ASP.NET
Azure SQL Database per dev: tutte le novità da non perdere
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


