Nello script #487 abbiamo visto come caricare entity in lazy loading utilizzando i proxy di Entity Framework. Questa non è la sola tecnica che permette di utilizzare il lazy loading; esuiste infatti una seconda tecnica che prevede l'utilizzo dell'interfaccia ILazyLoader. Quest'interfaccia può essere iniettata nel costruttore dell'entity e utilizzata dai getter delle navigation property per recuperare i dati dal database a run time.
public class Order { private ICollection<Detail> _details; public Order() { } private Order(ILazyLoader lazyLoader) { LazyLoader = lazyLoader; } private ILazyLoader 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(ILazyLoader lazyLoader) { LazyLoader = lazyLoader; } private ILazyLoader 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; } }
Come si vede dal codice, questa tecnica non necessità che le proprietà siano virtual in quanto il codice di lazy loading lo scriviamo noi nei getter utilizzando il metodo Load dell'interfaccia ILazyLoader. Rispetto ai proxy, questa tecnica offre un maggior controllo in quanto siamo noi a scrivere il codice e quindi a decidere se e quando caricare le navigation property a run time.
Lo sconveniente di questa tecnica consiste nell'accoppiamento tra le entity ed Entity Framework Core. Pur non rappresentando un problema nella maggioranza dei casi, questo accoppiamento risulta sicuramente sconveniente soprattutto a livello architetturale.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Real world .NET Architecture
Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
Dichiarare una variabile in JavaScript con le parole chiave var, let e const
Gestire le chiamate a servizi esterni in ASP.NET Core e Blazor tramite Polly
Autenticazione basata su certificati con ASP.NET Core
Montare blob e file share su Azure App Service
Utilizzare la parola chiave file nel codice C#
Dependency injection con Minimal API di ASP.NET Core
Nullish coalescing e decostruzione in JavaScript
Ottimizzare il codice JavaScript con i Shorthand Patterns - prima parte
Utilizzare l'attributo HTML inert per disabilitare gli eventi
Serializzare e deserializzare un tipo DateOnly con System.Text.Json