Prolonger la réponse de @Hrvoje Hudo ...
Code:
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;
}
Exemples
Mise en cache d'un seul élément (lorsque chaque élément est mis en cache en fonction de son ID, car la mise en cache de l'ensemble du catalogue pour le type d'élément serait trop intensive).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Mettre tout en cache
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Pourquoi TId
Le deuxième assistant est particulièrement agréable car la plupart des clés de données ne sont pas composites. Des méthodes supplémentaires pourraient être ajoutées si vous utilisez souvent des clés composites. De cette façon, vous évitez de faire toutes sortes de concaténation de chaînes ou de string.Formats pour obtenir la clé à passer à l'assistant de cache. Cela facilite également le passage de la méthode d'accès aux données car vous n'avez pas à passer l'ID dans la méthode wrapper ... le tout devient très concis et cohérent pour la majorité des cas d'utilisation.