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
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Creare una libreria CSS universale - Rotazione degli elementi
Integrare SQL Server in un progetto .NET Aspire
Configurare e gestire sidecar container in Azure App Service
Gestire codice JavaScript con code splitting e lazy loading
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Utilizzare Container Queries nominali
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Utilizzare Locust con Azure Load Testing
Creare un agente A2Acon Azure Logic Apps
Selettore CSS :has() e i suoi casi d'uso avanzati
Creare agenti facilmente con Azure AI Agent Service
I più letti di oggi
- Interagire con Azure DevOps tramite MCP Server
- ASPItalia.com Web Day: 18 anni - Milano
- IronPython arriva alla beta 6
- Le novità di C#6 e Visual Studio 2015
- Autenticazione ad applicazioni ASP.NET con Hawk
- Un custom control DropDownList con più DataTextField
- Tutorial ASP.NET MVC
- Tutorial Database
- chiudiamo con @GentiliMoreno: autenticazione e autorizzazione per #asp.netmvc e #webapi con #owin: https://aspit.co/web14-live #aspilive
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!