Розширення відповіді @Hrvoje Hudo ...
Код:
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;
}
Приклади
Кешування одного елемента (коли кожен елемент кешується на основі його ідентифікатора, оскільки кешування всього каталогу для типу елемента буде занадто інтенсивним).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Навчання всього чогось
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Чому TId
Другий помічник особливо приємний тим, що більшість ключів даних не є складовими. Додаткові методи можуть бути додані, якщо ви часто використовуєте складені ключі. Таким чином ви уникаєте робити різного роду об'єднання рядків або string.Formats, щоб отримати ключ для передачі до помічника кешу. Це також полегшує передачу методу доступу до даних, оскільки вам не доведеться передавати ідентифікатор у метод обгортки ... вся справа стає дуже короткою та стійкою для більшості випадків використання.