Erweiterung der Antwort von @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;
}
Beispiele
Zwischenspeichern einzelner Elemente (wenn jedes Element anhand seiner ID zwischengespeichert wird, da das Zwischenspeichern des gesamten Katalogs für den Elementtyp zu intensiv wäre).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Alles zwischenspeichern
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Warum TId
Der zweite Helfer ist besonders nett, da die meisten Datenschlüssel nicht zusammengesetzt sind. Zusätzliche Methoden können hinzugefügt werden, wenn Sie häufig zusammengesetzte Schlüssel verwenden. Auf diese Weise vermeiden Sie alle Arten von Zeichenfolgenverkettungen oder Zeichenfolgen. Formate, mit denen der Schlüssel an den Cache-Helfer übergeben wird. Dies erleichtert auch das Übergeben der Datenzugriffsmethode, da Sie die ID nicht an die Wrapper-Methode übergeben müssen. Das Ganze wird für die meisten Anwendungsfälle sehr knapp und konsistent.