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
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Potenziare la ricerca su Cosmos DB con Full Text Search
Creare una libreria CSS universale: Nav menu
Generare velocemente pagine CRUD in Blazor con QuickGrid
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Creare una custom property in GitHub
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Ottimizzazione dei block template in Angular 17
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Creare una libreria CSS universale: Cards
Migliorare la sicurezza dei prompt con Azure AI Studio
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps