Кэшированные данные доступны по ссылке? - PullRequest
1 голос
/ 21 мая 2010

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

results = (List<Software>)cache["software"];

А потом я возвращаю результаты и выполняю некоторую обработку, фильтрую для безопасности, и в конце концов она появляется на экране. К каждой записи программного обеспечения может быть подключено несколько ресурсов, и в зависимости от того, как идет защита, они могут видеть некоторые, все или ни одну из записей. Таким образом, при проверке безопасности он удалит некоторые из этих ресурсов из записи программного обеспечения.

Так что мой вопрос ... когда я возвращаю свой список результатов, это ссылка непосредственно на объект кеша? Итак, когда я удаляю ресурс из объекта программного обеспечения, он действительно также удаляется из кэша? Если это так, есть ли способ не вернуть его в качестве ссылки? Спасибо!

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

results = new List<Software>((List<Software>)cache["software"]);

это скопирует кэшированный список в мой список результатов, верно?

1 Ответ

2 голосов
/ 21 мая 2010

Вы ссылаетесь на один объект. Поэтому, если у пользователя A есть некоторые части объекта, которые он изменил, пользователь B также увидит эти изменения.

Вы должны сделать глубокую копию этого объекта после того, как вы получите его из кэша, но перед тем, как его отфильтровать. Таким образом, вы не столкнетесь с этим конфликтом. Таким образом, псевдокод будет выглядеть примерно так:

var results = (List<Software>)cache["software"];
var userresults = DeepCopyResults(results);
var filteredresults = UserFilter(userresults);

DeepCopyResults и UserFilter - это определенные вами функции.

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