Проблема с кэшированием ASP.NET - PullRequest
3 голосов
/ 14 мая 2009

В моем кеше есть два элемента

  1. Ключ: кошка
  2. Ключ: животные_Вакцинации

Теперь Animal_Vacinations имеет зависимость кэша на основе ключа от Cat. Таким образом, если что-то изменится для элемента кэша Cat, то элемент кэша Animal_Vacinations станет недействительным. ИДЕАЛЬНО:)

Хорошо ... теперь к проблеме.

После того, как я создаю 2-й элемент кэша (т. Е. Animal_Vacinations), я добавляю 3-й объект кэша : -

  1. Ключ: собака

Проблема в том, что 2-й объект также должен иметь зависимость от Dog. Во время создания 2-го объекта он знает, от каких элементов он должен зависеть. Так что в этом примере объект Animal_Vacination знает, что он должен зависеть от ...

  1. Cat
  2. собака
  3. Птица
  4. Джон Скит

Проблема в том, что, если я пытаюсь вставить объект Animal_Vacination в кеш со всеми этими 4 зависимостями, он завершается неудачно. Нет ошибки, просто не получается. (т.е. Cache["Animal_Vacination"] == null).

Причина этого заключается в том, что, когда я вставляю объект кэша с этими 4 зависимостями ... , но 1 или более из этих зависимостей не _exist_ ... это происходит изящно.

облом.

потому что в моем примере выше один из этих пропущенных трех объектов добавляется сразу после добавления объекта 2.

Итак ... есть ли способ добавить объект в кеш с ключами-зависимостями кеша, где 1 или более зависимостей еще не созданы, но МОГУТ быть созданы позже?

Ответы [ 2 ]

1 голос
/ 15 мая 2009

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

Если предположить, что где-то есть фрагмент кода, отвечающий за добавление чего-либо в кэш с ключом «Animal_Vacination», и этот код знает, от каких других кэшированных элементов зависит элемент «Animal_Vacination», то этот код должен создать каждый из необходимые зависимости ключа кеша, включая добавление в кеш объектов Null, если необходимо, для любых зависимых элементов, которые там еще не найдены.

Так, например, в приведенном вами примере, где в кеше уже есть «Cat» до добавления «Animal_Vacination», тогда логика, ответственная за добавление «Animal_Vacination» в кеш, должна проверять кеш на наличие каждого зависимого элемента, то есть «Кошка», «Собака», «Птица», «Джон Скит»; если он не найден, в кэш для этого ключа следует добавить объект-заполнитель или упакованное значение (может быть, пустую строку) (в данном случае для «Dog», «Bird» и «Jon Skeet»); как только все зависимые элементы существуют в кеше, создайте зависимости кеша и добавьте «Animal_Vacination» в кеш. (В качестве альтернативы вызовите Cache.Add с объектом-заполнителем для каждого из необходимых зависимых ключей, не проверив сначала, существуют ли они с помощью Get, и используйте обработчик исключения, чтобы проглотить выброшенное исключение, если оно уже существует.)

Продолжая ваш пример, когда после этого действия в кеш добавляется реальное что-то с ключом «Собака», с использованием «Вставка» вместо «Добавить», чтобы учесть вероятность того, что ключ уже существует (как это происходит в этом пример), тогда замена элемента кэша «Dog», который был просто нулевым значением, приведет к аннулированию элемента кэша «Animal_Vacination» в соответствии с его зависимостью кэша.

0 голосов
/ 14 мая 2009

Что вы можете сделать, это добавить зависимость после добавления самого элемента. так было бы так:
добавить ключ Cat
добавить ключ Animal_Vacination
добавить зависимость кэша для Animal_Vacination
добавить ключ собака
отредактируйте зависимость кэша для Animal_Vacination, чтобы он содержал собаку.
добавить ключ Bird
измените зависимость кэша для Animal_Vacination так, чтобы он содержал Bird,
и так далее ...

...