использование блоков приложения кеша корпоративной библиотеки в asp.net mvc2 - PullRequest
1 голос
/ 06 апреля 2011

Я пытался использовать блоки приложения кеша корпоративной библиотеки Microsoft. Я использовал MS Enterprise Library V5.0

Вот пример кода, который я сделал, внутри метода индекса домашнего контроллера.

        Person p = new Person(10, "person1");
        ICacheManager cacheMgr = CacheFactory.GetCacheManager("myCache");
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        if (Session["currsession"] != null)
        {
            if (!cacheMgr.Contains(p.pid.ToString()))
            {
                Response.Write("item is not in cache");
                return View(p);
            }
            else
            {
                Response.Write("item is still in cache");
                return View(p);
            }
        }
        else
        {
            Session["currsession"] = 1;
            cacheMgr.Add(p.pid.ToString(), p, CacheItemPriority.High, null, new SlidingTime(TimeSpan.FromSeconds(10)));
            return View(cacheMgr.GetData(p.pid.ToString()));
        }

Класс person, который я использую в модели, имеет только конструктор с 2 открытыми свойствами. Ничего особенного не используется.

Теперь, это правильная процедура для использования кэширования блоков кэширования корпоративной библиотеки. Если нет, то как еще можно эффективно кодировать этот блок кода.

Кроме того, я получаю ответ как item is not in cache только после 20-секундной задержки. Есть ли какая-либо ошибка в реализации кода или есть теория кеширования в деталях.

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

1 Ответ

0 голосов
/ 06 апреля 2011

Поскольку вы указываете скользящий срок действия 10 секунд, это означает, что вы получите item is not in cache, если вы подождете более 10 секунд между перезагрузками страницы.

Загрузка в первый раз в сеансе => нет сообщений
Обновить => в кеше
Обновить => в кеше
Подождите 10 секунд
Обновить => не в кеше

Это то, что вы видите?


Старый ответ:

Корпоративный блок приложения для кэширования, вероятно, намного больше, чем вам нужно. Мой любимый кеш - FubuMVC Cache (просто включает FubuCore.dll). Вы можете получить очень похожую реализацию, используя ConcurrentDictionary с делегатом «отсутствующий элемент». Вот пример: http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/37bbc361-6851-43db-9e90-80cc7e6ac15f

Пример FubuMVC Cache:

public class PersonCache
{
    private Cache _Cache = new Cache();

    public PersonCache()
    {
        _Cache.OnMissing = key => MyDatabase.People.GetById(key);
    }

    public Person GetById(int id)
    {
        return _Cache[id];
    }
}
...