Как выполнить кеширование в MVC - PullRequest
1 голос
/ 23 февраля 2010

Я хочу выполнить кэширование данных за 1 день. В моей модели MVC я получаю данные из базы данных и использую их в моем представлении. Я хочу добавить данные в кеш, если их там нет. Если они уже есть в кеше, то получить результат непосредственно из формы. В моей модели у меня есть функция result (), в которой я использовал кеширование как

if (HttpContext.Current.Cache[ID] == null)
{   
  query = db.Employee.FirstOrDefault(x=>x.id.Equals(ID));  
          HttpContext.Current.Cache.Insert
            (ID, query, null,DateTime.Now.AddDays(1),  
               System.Web.Caching.Cache.NoSlidingExpiration);
} else query = (Employee)HttpContext.Current.Cache[ID];

Но здесь кэширование работает только для текущего запроса, и после этого данные снова извлекаются из базы данных, и для этих же данных выполняется новая вставка в кэш. Я хочу, чтобы данные в кеше за 1 день. Пожалуйста, предоставьте мне способ кэширования моих данных.

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Хотите ли вы кэшировать весь вывод ваших действий или это просто запросы к вашей базе данных?

Если это так, используйте атрибут OutputCache для своих действий следующим образом:

[OutputCache(Duration = 86400, VaryByParam = "None")]
public ActionResult Index()
{
    var data = GetFromDatabase();
    return View(data);
}

86400 означает, что мы хотим кэшировать его в течение 24 часов.

Обратите внимание, что это кэширует весь вид, поэтому все ваши пользователи будут видеть то же самое. Если у вас есть пользовательский контент, оставьте комментарий, и я постараюсь дать вам новое решение.

0 голосов
/ 23 февраля 2010

Если возможно - кеш ViewResults . Проще и лучше.

Для необработанного кэширования я использую это, и оно работает как положено (через несколько запросов) =>

public static class CacheManager
    {
        public static bool Exists
            (string cacheKey, HttpContextBase context)
        {
            return context.Cache[cacheKey] != null;
        }

        public static object Get
            (string cacheKey, HttpContextBase context)
        {
            return context.Cache[cacheKey];
        }

        public static T Get<T>
            (string cacheKey, HttpContextBase context)
            where T : class
        {
            return context.Cache.Get(cacheKey) as T;
        }

        public static T Get<T>
            (string cacheKey, HttpContextBase context, Func<T> getItemCallback)
            where T : class
        {
            T item = Get<T>(cacheKey, context);
            if (item == null) {
                item = getItemCallback();
                //by default - caching for 1 day
                if (item!=null)
                    context.Cache.Insert(cacheKey, item, null, 
                        DateTime.Now.AddDays(1),TimeSpan.Zero);
            }

            return item;
        }

        public static void Save<T>
            (string cacheKey, HttpContextBase context, T value)
            where T : class
        {
            context.Cache.Insert(cacheKey, value);
        }
    }

Использование =>

 public IList<Database> AllDatabases
        {
            get
            {
                return CacheManager.Get
                   (CacheKeys.AllDatabases, ControllerContext.HttpContext,
                    () => databaseRepository.GetAll());
            }
        }

Только - я считаю, что проходить контекстную базу - ненужная сложность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...