30 messaggi dal 17 febbraio 2015
Ragazzi ho necessità di una mano da parte vostra...

Sto cercando di capire come gestire la cache lato server in Razor, senza controller e MVC.

In giro ho trovato questo:

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMemoryCache();
}


CacheEsempio.cs:


public class IndexModel : PageModel
{
    private readonly IMemoryCache _cache;

    public IndexModel(IMemoryCache cache)
    {
        _cache = cache;
    }
    ...
}



E poi... come continuo?

Grazie in anticipo!
10.957 messaggi dal 09 febbraio 2002
Contributi
Ciao, qual è il tuo obiettivo? Cioè, cosa devi mettere in cache?
Modificato da BrightSoul il 05 ottobre 2018 14.45 -

Enjoy learning and just keep making
30 messaggi dal 17 febbraio 2015
Ciao Moreno!

In pratica ho pensato a tre tipi di cache:

1) dati estratti dal database (dati dei prodotti, impostazioni del sito, ...)

2) blocchi di sezioni html statici (menu e altre piccole sezioni)

3) files, immagini, css lato client.


Credo di essermi imbarcato in un progetto ancora, forse, troppo 'nuovo' puntando al solo C#/Razor, visto che su internet si trovano solamente esempi in MVC. :-(
10.957 messaggi dal 09 febbraio 2002
Contributi
Ciao,
quei tre sono tipi di cache differenti. Il servizio IMemoryCache può assolvere solo al primo, mentre il secondo lo risolvi con il tag helper cache, purché ci sia del codice altrimenti se è solo un "blocco di html statico", non c'è motivo di metterlo in cache.
Infine, per il terzo tipo puoi usare il middleware dei file statici per fargli aggiungere un'intestazione Cache-Control in modo che il browser client sappia per quanto tempo può tenere in cache i file. Leggi qui:
https://docs.microsoft.com/it-it/aspnet/core/fundamentals/static-files?view=aspnetcore-2.1&tabs=aspnetcore2x#set-http-response-headers


visto che su internet si trovano solamente esempi in MVC. :-(

Beh, per usare il IMemoryCache non c'è bisogno di usare né MVC né Razor Pages. E' un servizio che espone dei metodi pubblici che puoi usare ovunque. Prendi per esempio questa pagina della documentazione:
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-2.1
E' vero che IMemoryCache viene mostrato nell'action di un controller MVC ma, tolto questo guscio esterno, puoi usare i suoi metodi Get, GetOrCreate e così via anche in Razor Pages o in qualsiasi altro punto dell'applicazione.

public class IndexModel : PageModel
{
    private readonly IMemoryCache _cache;

    public IndexModel(IMemoryCache cache)
    {
        _cache = cache;
    }
    ...
}

Questo è corretto. Hai ricevuto il servizio IMemoryCache come parametro del costruttore e ora lo puoi usare dagli altri metodi della Razor Page, tipo OnGet. Nel link alla documentazione che ho postato sopra, infatti, trovi anche un esempio di una Razor Page. Cerca "OnGet" per trovarlo.

Comunque, secondo me gli esempi riportati dalla documentazione sono buoni per iniziare però poi quando l'applicazione cresce rischi di trovarti l'IMemoryCache tra i piedi in ogni razor page, riducendo la leggibilità del suo codice.

Il caching è una responsabilità trasversale e perciò non dovrebbe apparire né in una razor page né in un controller MVC. Supponiamo che tu voglia accedere a un database e cachare i risultati: per prima cosa dovresti creare un tuo servizio IProductRepository che espone dei metodi come GetById e GetAll che ti permetteranno di recuperare i prodotti. Quindi crei un'implementazione concreta come AdoNetProductRepository che conterrà la logica vera e propria di accesso al database. In questo modo sposti la logica di accesso ai dati fuori dalla Razor Page, sia per motivi di riutilizzo del codice e sia perché stabilire la logica di accesso ai dati non è una responsabilità della Razor Page.

Poi, volendo aggiungere anche il caching dei dati, crei un'altra implementazione concreta del servizio IProductRepository chiamata ad esempio CachedProductRepository che wrappa l'AdoNetProductRepository e che non farà altro che invocare i suoi metodi. Quando torna il risultato, se lo mette in cache prima di restituirlo al cliente, in modo che possa lui stesso restituire il risultato alle successive invocazioni. Questo è anche chiamato decorator pattern che ti porta a costruire dei servizi tipo cipolla in cui ogni stato offre una singola funzionalità specifica.

Qui trovi alcuni nostri script sulla cache:
http://tags.aspitalia.com/Cache/

ciao,
Moreno
Modificato da BrightSoul il 05 ottobre 2018 22.53 -
Modificato da BrightSoul il 05 ottobre 2018 22.54 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.