我遇到了一个奇怪的问题,这是我唯一能想到的。我在缓存中存储了一个列表,当用户使用该站点时,我随机丢失列表中的项目。我有一个被调用的类,要么转到缓存并从那里返回列表,要么缓存超过某个时间帧,它会进入数据库并刷新缓存。因此,当我从缓存中提取数据时,这就是它的样子......
results = (List<Software>)cache["software"];
然后我返回结果并进行一些处理,过滤安全性,最终它会在屏幕上结束。对于每个软件记录,可以附加多个资源,并且根据安全性如何,他们可能会看到一些,全部或没有记录。因此,在安全检查中,它将从软件记录中删除一些这些资源。
所以我的问题是......当我返回结果列表时,它是否直接引用缓存对象?因此,当我从软件对象中删除资源时,它实际上也是从缓存中删除的?如果是这种情况,有没有办法不将它作为参考返回?谢谢!
编辑:我想我可能刚刚回答了我自己的问题....所以如果我这样做的话:
results = new List<Software>((List<Software>)cache["software"]);
它会将缓存的列表复制到我的结果列表中,对吗?
答案 0 :(得分:2)
您正在引用单个对象。因此,如果用户A更改了对象的某些部分,则用户B也会看到这些更改。
从缓存中获取此对象之后,应该对其进行deep copy,但在对其进行过滤之前。这样你就不会遇到这种冲突。所以伪代码就是这样的:
var results = (List<Software>)cache["software"];
var userresults = DeepCopyResults(results);
var filteredresults = UserFilter(userresults);
DeepCopyResults
和UserFilter
是您定义的功能。