Capita spesso di realizzare applicativi dei servizi in Blazor che richiedono un'inizializzazione asincrona - per esempio per recuperare dei parametri di configurazione tramite una chiamata HTTP.
Purtroppo, come sappiamo, non possiamo invocare metodi asincroni in un costruttore, quindi tipicamente la soluzione consiste nello scrivere codice boilerplate come il seguente, ossia creando un metodo che si occupi di inizializzare MyService, e che dobbiamo ricordarci di invocare in ognuno degli altri metodi che MyService espone.
public class MyService
{
private bool _isInitialized;
public async Task Method1()
{
await this.EnsureInitializedAsync();
// Codice di Method1
}
public async Task Method2()
{
await this.EnsureInitializedAsync();
// Codice di Method2
}
public async Task EnsureInitializedAsync()
{
if (!_isInitialized)
{
// Codice di inizializzazione
}
}
}Ovviamente, oltre che scomoda, questa tecnica è anche soggetta a errori, perché potremmo dimenticarci la chiamata a EnsureInitializedAsync e introdurre bug nell'applicazione.
Una possibile alternativa, allora, è forzare l'inizializzazione di questa classe allo Startup, tramite il seguente codice:
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
// registro i servizi su IoC container...
builder.Services.AddScoped<MyService>();
var host = builder.Build();
var myService = host.Services.GetRequiredService<MyService>();
await myService.InitializeAsync();
await host.RunAsync();
}
}Dopo aver registrato il servizio, abbiamo rimpiazzato la tipica linea di codice
await builder.Build().RunAsync();
con una versione che dopo aver creato l'host, richieda un'istanza di MyService prima di chiamare RunAsync.
Essendo Main un metodo asincrono, possiamo effettuare l'await della nostra chiamata di inizializzazione. Inoltre, dato che questo codice viene eseguito prima che il componente App venga istanziato, siamo certi che nessun altro componente invochi MyService prima che questo sia pienamente operativo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire lo streaming AI con Angular Signals e React State
Semplificare la gestione dei modelli con Azure AI Foundry Model Router
Introduzione ai GitHub Agentic Workflows
Gestire trasferimenti cloud con Azure Storage Mover
Diagnosticare e monitorare Azure con Azure MCP Server
Blazor e Static Web Assets in .NET 10
Nuove validazioni Form Blazor
Creare un indice su una colonna JSON in SQL Server
Supporto nativo a JSON in SQL Server 2025
Effettuare la ricerca di testo nascosto in una pagina web con Javascript
Monitorare le tabelle di Azure SQL Database con Change Event Streaming
I più letti di oggi
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Accedere a dati esposti con WebService con Silverlight 1.0
- Utilizzare dati in formato XML in XAML


