Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Начиная с версии .NET 4.0 во фреймворк был добавлен класс MemoryCache, который предназначен для кэширования контента. Данный класс не предназначен только для создания веб-приложений в ASP.NET, его можно использовать и при написании графических и даже консольных приложений.
При использовании MemoryCache следует учитывать, что объект этого класса привязан к домену приложения. И также надо учитывать, что этот объект будет уничтожаться веб-сервером IIS при перезапуске пула приложения в следующих случаях:
Если в течение 20 минут не было запросов к приложению
Если с момента запуска (последнего перезапуска) приложения прошло 1740 минут - временной интервал для перезапуска приложений в IIS по умолчанию
Если в папку проекта на IIS была добавлена новая копия приложения (идет автоматический перезапуск)
Для использования MemoryCache надо добавить в проект библиотеку System.Runtime.Caching.dll.
Пусть у нас есть некоторая модель Phone и класс контекста данных PhoneContext:
public class Phone { public int Id { get; set; } public string Name { get; set; } } public class PhoneContext : DbContext { public DbSet<Phone> Phones { get; set; } }
Добавим новый класс, который будет использовать функционал MemoryCache:
using System.Runtime.Caching; //.......................... public class AppCache { public Phone GetValue(int id) { MemoryCache memoryCache = MemoryCache.Default; return memoryCache.Get(id.ToString()) as Phone; } public bool Add(Phone value) { MemoryCache memoryCache = MemoryCache.Default; return memoryCache.Add(value.Id.ToString(), value, DateTime.Now.AddMinutes(10)); } public void Update(Phone value) { MemoryCache memoryCache = MemoryCache.Default; memoryCache.Set(value.Id.ToString(), value, DateTime.Now.AddMinutes(10)); } public void Delete(int id) { MemoryCache memoryCache = MemoryCache.Default; if (memoryCache.Contains(id.ToString())) { memoryCache.Remove(id.ToString()); } } }
Во многом данный класс напоминает стандартный репозиторий. Теперь применим его для получения объекта Phone в методе контроллера:
public class PhonesController : Controller { private PhoneContext db = new PhoneContext(); private AppCache appCache; public PhonesController() { appCache = new AppCache(); } public ActionResult Index(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var result = appCache.GetValue(id.Value); // если нет в кэше if(result==null) { // берем из БД result = db.Phones.Find(id); // добавляем в кэш appCache.Add(result); } if (result == null) { return HttpNotFound(); } return View(result); } }