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 la telemetria nella CLI di GitHub
Modificare lo stile in una QuickGrid Blazor
Dallo sviluppo locale ad Azure con .NET Aspire
Stop alle password con Azure Managed Identity
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance
DevSecOps per .NET: dalla teoria alla pratica
Effettuare chiamate API tramite GitHub App
Supporto nativo a JSON in SQL Server 2025
Validazione personalizzata nelle Minimal API di ASP.NET Core
Ottimizzare le API in ASP.NET con Feature Flags
Ottimizzare gli indici con Automatic Index Compaction in Azure SQL Database
Importare repository da Bitbucket a GitHub Enterprise Cloud


