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
Disabilitare automaticamente un workflow di GitHub (parte 2)
Cambiare la chiave di partizionamento di Azure Cosmos DB
Evitare la command injection in un workflow di GitHub
Evitare il flickering dei componenti nel prerender di Blazor 8
Usare lo spread operator con i collection initializer in C#
Creare un'applicazione React e configurare Tailwind CSS
Configurare policy CORS in Azure Container Apps
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Disabilitare automaticamente un workflow di GitHub
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Potenziare Azure AI Search con la ricerca vettoriale
Utilizzare politiche di resiliency con Azure Container App