Ottimo articolo! Quello che non avete spiegato però è la seguente cosa: se io inizio adesso un progetto nuovo con Blazor e tra un anno (non so il termine temporale) uscirà finalmente la parte client con WebAssembly, il passaggio tra quella server e quella client, averà in maniera indolore cambiando poche cose, o sarà un bagno di sangue?
Ciao, grazie!
Dipende da come strutturi l'applicazione. Se nel blocco @code usi Entity Framework Core per leggere i dati dal database, poi quel codice non potrà funzionare una volta che ti sposti su Blazor WebAssembly, perché il database non sarà direttamente accessibile dal client. Dovrai invece fare affidamento sull'oggetto HttpClient in modo da inviare una richiesta ad una Web API.
Se hai tanti Razor Component, dovrai fare parecchie modifiche.
Un'alternativa migliore potrebbe essere quella di astrarre dall'effettiva tecnica usata per recuperare i dati, in modo che nel Razor Component non ci sia traccia né di EFCore né di HttpClient. Supponiamo che il tuo Razor Component sia scritto così:
@page "/products"
@inject IProductService productService
<h1>Prodotti</h1>
<table>
@foreach (var product in products)
{
//...
}
</table>
@code {
ProductDto[] products;
protected override async Task OnInitializedAsync()
{
products = await productService.GetAllAsync();
}
}
Come vedi, io sto recuperando i prodotti sfruttando un servizio che implementa IProductService. In questo modo il Razor Component resta completamente agnostico del codice infrastrutturale che serve a recuperare i prodotti. Fintanto che sei su Blazor Server, la dipendenza da IProductService verrà risolta con una implementazione concreta che internamente sfrutta EfCore.
Nel momento invece in cui vai su WebAssembly, dovrai scrivere un'altra implementazione concreta che si avvale di HttpClient. Quindi un po' di lavoro andrà comunque fatto.
Qui c'è un link per approfondire la questione della dependency injection in Blazor WebAssembly.
https://docs.microsoft.com/it-it/aspnet/core/blazor/dependency-injection?view=aspnetcore-3.0Ciao e di nuovo grazie!
Moreno