Я использую C# 4.0
, Asp.Net
. У меня возникла проблема с правильным построением структуры readonly
в созданном мной пользовательском кеше.
Подробности (краткое описание):
Мой класс CacheManager (синглтон) использует в качестве параметра экземпляр существующего класса MemoryCache
и включает в себя несколько полезных методов для работы с дополнительными вещами, такими как жизнь объекта. цикл в моем пользовательском кеше.
Этот менеджер имеет дело с простым CachableObject
, который принимает три переменные:
object
DateTime
int
(продолжительность)
Таким образом, мой пользовательский менеджер кеша хранит objects
в течение ограниченного периода времени, чтобы защитить мою базу данных от частых больших запросов.
В последнее время я пытался:
- Вернул объект из кеша (то есть: хранится под ключом
-MyList
) - Вернул его обратно в список сложных объектов
- Переведено содержание некоторых свойств для каждого сложного объекта
- Снова сохранен только что переведенный список объектов в кеше (под другим ключом
-MyTranslatedList
)
Проблема:
Во время тестирования мне показалось, что оба списка, хранящиеся в кеше (необработанный и переведенный), ссылаются на одни и те же базовые объекты. Следовательно, после перевода эти объекты фактически были переведены в оба списка.
Поскольку каждый список содержит только ссылки на объекты, это совершенно нормальное поведение и глупая ошибка с моей стороны.
Вопрос:
Как вы можете легко догадаться, я хотел бы защитить себя и других пользователей моего синглтона от подобных ошибок.
Я хотел бы вставить (или сохранить или получить) любой объект (или список сложных объектов), чтобы никто не мог изменить их через кеш. Я хотел бы, чтобы данные в моем кеше были доступны только для чтения (и глубоко только для чтения), чтобы избежать подобных проблем. Я хочу, чтобы каждый должен создать глубокую копию (или, что еще лучше, получить ее), прежде чем начать использовать данные, хранящиеся в кеше.
Что я пробовал до сих пор:
я пытался сделать object
доступным только для чтения. Это не сработало, как ожидалось.
Поскольку я часто храню список сложных объектов, я нашел метод AsReadOnly, который возвращает IReadOnlyCollection
, но, хотя это не позволяет мне изменять список (добавлять, удалять), он не защищает объекты, находящиеся в списке.
Я надеюсь, что мое объяснение несколько понятно :) Есть ли изящный способ справиться с такой ситуацией?
ICloneable
или предоставить для них интерфейс только для чтения. - person JustSomeGuy   schedule 12.03.2015