通过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缓存项后可以任意修改其属性,除非把所有属性都设为只读的,可设为只读后只能用构造函数初始化了,不方便使用
所以很想知道有没有其它方法可以很好的解决这个问题
封装一下
封装?
把实体的属性设为只读或深拷贝?有没有其它方法呢
public int MyProperty { get; private set; }
@BXTX: 你封装一个缓存类
只有add和get方法,不提供set方法.
谢谢
get到的对象还是可以设置对象属性的值的,还只控制不了
@BXTX: 这是由于你没有做正经的缓存,还是直接一个对象在运行室内。
如果你做运行时外的缓存,就不会了
@吴瑞祥: 哦,多谢了,那相当于是:将对象序列化后插入缓存,从缓存中取出后再反序列化为对象。
再请教下,我们一般用的 HttpContent.Cache和集合都是你说的运行时内缓存,
那运行时外的缓存一般怎样实现呢?要用什么框架吗,谢谢了
你可以在User 里面设置一个属性
ReadOnly
然后在set的时候判断 readOnly是否为true 如果为true 就抛出异常
默认为false
谢谢,那要在User的每一个属性的set中都要判断了
@BXTX: 那是肯定的 难道你闲麻烦?