Вы должны ссылаться на объект HttpRuntime.Cache
. Я создал обертку вокруг этого, похожую на ту, на которую вы ссылались в своем вопросе. Не стесняйтесь использовать его:
using System.Web.Caching;
public class CachingService
{
protected Cache Cache
{
get;
set;
}
public int CacheDurationMinutes
{
get;
set;
}
public CachingService()
{
Cache = HttpRuntime.Cache;
CacheDurationMinutes = 60;
}
public virtual object Get(string keyname)
{
return Cache[keyname];
}
public virtual T Get<T>(string keyname)
{
T item = (T)Cache[keyname];
return item;
}
public virtual void Insert(string keyname, object item)
{
Cache.Insert(keyname, item, null, DateTime.UtcNow.AddMinutes(CacheDurationMinutes), Cache.NoSlidingExpiration);
}
public virtual void Insert(string keyname, object item, CacheDependency dependency)
{
Cache.Insert(keyname, item, dependency);
}
public virtual void Remove(string keyname)
{
Cache.Remove(keyname);
}
}
Вот пример использования. Функция LoadPosts
предназначена для загрузки сообщений в блоге для отображения на сайте. Функция сначала увидит, кэшированы ли записи, если нет, загрузит записи из базы данных, а затем кеширует их:
public IEnumerable<BlogPost> LoadPosts()
{
var cacheService = new CachingService();
var blogPosts = cacheService.Get<IEnumerable<BlogPost>>("BlogPosts");
if (blogPosts == null)
{
blogPosts = postManager.LoadPostsFromDatabase();
cacheService.Insert("BlogPosts", blogPosts);
}
return blogPosts;
}
При первом запуске этой функции кэш вернет null
, поскольку мы еще ничего не добавляли в ключ BlogPosts. Второй раз, когда вызывается функция, сообщения будут находиться в кеше, а код в блоке if
не будет запущен, что спасет нас от поездки в базу данных.