首页 新闻 会员 周边 捐助

C#缓存一致性/防止修改缓存项

0
悬赏园豆:10 [已解决问题] 解决于 2014-12-06 10:54

通过Cache或者静态集合作为缓存时,获取缓存项后可以任意修改,比如下面的代码,获取缓存项后可以把张三修改为李四,这样缓存中的内容就变了。

请教各位:怎样设计才能让其他用户不能随便修改缓存项呢?多谢了

class UserCache
{
    static List<User> userList = new List<User>();
    static UserCache()
    {
        userList.Add(new User { Id = 1, Name = "张三" });
    }
    public static User GetByCache(int id)
    {
        return ..
    }
}
class Program
{
    static void Main(string[] args)
    {
        var user = UserCache.GetByCache(1);
        user.Name = "李四";
问题补充:

之所以提这个问题是每次在用缓存的时候都很纠结,无法保证缓存对象不被任意修改

因为get缓存项后可以任意修改其属性,除非把所有属性都设为只读的,可设为只读后只能用构造函数初始化了,不方便使用

所以很想知道有没有其它方法可以很好的解决这个问题

wangd的主页 wangd | 初学一级 | 园豆:75
提问于:2014-11-23 15:39
< >
分享
最佳答案
0

封装一下

收获园豆:10
吴瑞祥 | 高人七级 |园豆:29449 | 2014-11-23 16:10

封装?

把实体的属性设为只读或深拷贝?有没有其它方法呢

public int MyProperty { get; private set; }
wangd | 园豆:75 (初学一级) | 2014-11-24 10:26

@BXTX: 你封装一个缓存类

只有add和get方法,不提供set方法.

吴瑞祥 | 园豆:29449 (高人七级) | 2014-11-24 10:30

谢谢

get到的对象还是可以设置对象属性的值的,还只控制不了

wangd | 园豆:75 (初学一级) | 2014-11-26 22:04

@BXTX: 这是由于你没有做正经的缓存,还是直接一个对象在运行室内。

如果你做运行时外的缓存,就不会了

吴瑞祥 | 园豆:29449 (高人七级) | 2014-11-26 23:00

@吴瑞祥: 哦,多谢了,那相当于是:将对象序列化后插入缓存,从缓存中取出后再反序列化为对象。

再请教下,我们一般用的 HttpContent.Cache和集合都是你说的运行时内缓存,

那运行时外的缓存一般怎样实现呢?要用什么框架吗,谢谢了

wangd | 园豆:75 (初学一级) | 2014-11-28 01:04
其他回答(1)
0

你可以在User 里面设置一个属性

ReadOnly

然后在set的时候判断 readOnly是否为true 如果为true 就抛出异常

默认为false

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-24 15:24

谢谢,那要在User的每一个属性的set中都要判断了

支持(0) 反对(0) wangd | 园豆:75 (初学一级) | 2014-11-26 22:03

@BXTX: 那是肯定的 难道你闲麻烦?

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-28 19:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册