Utilizzare il lazy loading tramite Action con Entity Framework Core 2.1

di Stefano Mostarda, in LINQ,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi