Estensione della risposta di @Hrvoje Hudo ...
Codice:
using System;
using System.Runtime.Caching;
public class InMemoryCache : ICacheService
{
public TValue Get<TValue>(string cacheKey, int durationInMinutes, Func<TValue> getItemCallback) where TValue : class
{
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback();
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
public TValue Get<TValue, TId>(string cacheKeyFormat, TId id, int durationInMinutes, Func<TId, TValue> getItemCallback) where TValue : class
{
string cacheKey = string.Format(cacheKeyFormat, id);
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback(id);
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
}
interface ICacheService
{
TValue Get<TValue>(string cacheKey, Func<TValue> getItemCallback) where TValue : class;
TValue Get<TValue, TId>(string cacheKeyFormat, TId id, Func<TId, TValue> getItemCallback) where TValue : class;
}
Esempi
Memorizzazione nella cache di un singolo articolo (quando ogni articolo viene memorizzato nella cache in base al suo ID perché la memorizzazione nella cache dell'intero catalogo per il tipo di articolo sarebbe troppo intensiva).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Memorizzazione nella cache di tutto
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Perché TId
Il secondo aiuto è particolarmente utile perché la maggior parte delle chiavi dei dati non sono composte. È possibile aggiungere ulteriori metodi se si utilizzano spesso chiavi composite. In questo modo eviti di eseguire qualsiasi tipo di concatenazione o stringa di stringhe. Formatta per ottenere la chiave da passare all'helper della cache. Inoltre, rende più semplice il passaggio del metodo di accesso ai dati perché non è necessario passare l'ID nel metodo wrapper ... il tutto diventa molto conciso e coerente per la maggior parte dei casi d'uso.