Ampliando la respuesta de @Hrvoje Hudo ...
Código:
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;
}
Ejemplos
Almacenamiento en caché de un solo elemento (cuando cada elemento se almacena en caché en función de su ID porque el almacenamiento en caché de todo el catálogo para el tipo de artículo sería demasiado intenso).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Guardar en caché todo
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Por qué TId
El segundo ayudante es especialmente bueno porque la mayoría de las claves de datos no son compuestas. Se podrían agregar métodos adicionales si utiliza claves compuestas a menudo. De esta forma, evita hacer todo tipo de concatenación de cadenas o cadenas. Formatos para que la clave pase al ayudante de caché. También facilita la transferencia del método de acceso a datos porque no tiene que pasar la ID al método de envoltura ... todo se vuelve muy conciso y consistente para la mayoría de los casos de uso.