Nello script #489 abiamo visto come utilizzare il lazy loading di Entity Framework tramite l'interfaccia ILazyLoader. Come detto, questa tecnica ci fa scrivere più codice rispetto all'utilizo dei proxy (il che non è necessariamente un male in quanto ci da il pieno controllo sul trigger del laz loading), ma soprattutto lega il nostro modello a Entity Framework e questo puà risultare un problema in alcuni casi.
Per ovviare a questo problema, possiamo iniettare una Action al posto dell'interfaccia ILazyoader; questa action rappresenta la chiamata al metodo Load dell'interfaccia ILazyLoader.
public class Order { private ICollection<Detail> _details; public Order() { } private Order(Action<object, string> lazyLoader) { LazyLoader = lazyLoader; } private Action<object, string> LazyLoader { get; set; } public int Id { get; set; } public DateTime Date { get; set; } public ICollection<Order> Orders { get => LazyLoader.Load(this, ref _orders); set => _orders = value; } } public class Detail { private Order _order; public Detail() { } private Detail(Action<object, string> lazyLoader) { LazyLoader = lazyLoader; } private Action<object, string> LazyLoader { get; set; } public int Id { get; set; } public string Quantity { get; set; } public string UnitCost { get; set; } public Order Order { get => LazyLoader.Load(this, ref _order); set => _order = value; } } public static class PocoLoadingExtensions { public static T Load<T>(this Action<object, string> loader, object entity, ref T navigationField, [CallerMemberName] string navigationName = null) where T : class { loader?.Invoke(entity, navigationName); return navigationField; } }
Come si evince dal codice, la action prende il posto dell'interfaccia e viene invocata nel getter delle navigation property rendendo il codice molto simile a quello utilizzato con ILazyLoader. Tuttavia la classe Action non ha un metodo Load; questo è un extension method che si occupa di recuperare il nome della navigation property e di invocare la action tornandone il risultato così da rendere meno ripetitivo il codice.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Montare Azure Blob Storage su Linux con BlobFuse2
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Ricevere notifiche sui test con Azure Load Testing
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Utilizzare WebJobs su Linux con Azure App Service
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Ordine e importanza per @layer in CSS
Gestire progetti NPM in .NET Aspire
Fissare una versione dell'agent nelle pipeline di Azure DevOps
I più letti di oggi
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- .NET Conference Italia 2025 - Milano
- Gestione ciclo di vita in .NET Aspire
- The Agentic Day - Milano
- Gestione CSS in Blazor con .NET 9
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Gestione file Javascript in Blazor con .NET 9
- Inviare un'e-mail con ASP.NET