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.1E' 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 -