.net关于应用程序缓存的一些疑惑

疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥???

首先是创建缓存的方法:

/// <summary>
        /// 创建缓存项过期
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="obj">object对象</param>
        /// <param name="expires">过期时间(分钟)</param>
        public static void Insert(string key, object obj, int expires)
        {
            HttpContext.Current.Cache.Insert(key, obj, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, expires, 0));
        }

获取缓存的方法:

/// <summary>
        /// 获取缓存对象
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <returns>object对象</returns>
        public static object Get(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return null;
            }
            return HttpContext.Current.Cache.Get(key);
        }

开始使用缓存:

/// <summary>
        /// 得到一个对象实体
        /// </summary>
        public Model.article_news GetNewsModel(int id)
        {
            string key = "getmo" + id.ToString();
            object objModel = CacheHelper.Get(key);
            if (objModel == null)
            {
                objModel = dal.GetNewsModel(id);
                if (objModel != null)
                {
                    CacheHelper.Insert(key, objModel, 10);
                }
            }
            return (Model.article_news)objModel;
        }

 这个方法逻辑总没问题吧

 

接着来前台的代码:

       BLL.article bll = new BLL.article();
            Model.article_news model = bll.GetNewsModel(_id);
            object obj = System.Web.HttpContext.Current.Cache.Get("getmo" + _id + "");
            model.title = "222222222222222";
            ddlCategoryId.SelectedValue = model.category_id.ToString();
            object obj2 = System.Web.HttpContext.Current.Cache.Get("getmo" + _id + "");
            txtTitle.Text = model.title;

  下面的代码就省略了,就是获取一个实体对象,对比更改title后的原缓存值

第一个obj对象中的值如图:

 这当然是正常的。

接着是更改title后的缓存对象的值:

我改的是Model中的值,但是缓存中title的值也变了,why???

引用类型数据? 我new了一个Model的对象还是这种结果!!!

最总解决方法是使用深复制拷贝一个新的model对象

解决步骤:

先建一个公共的处理类,用于深复制:

#region 引用数据类型深复制
        /// <summary>
        /// 引用数据类型深复制
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="serializableObject">要复制的范本</param>
        /// <returns>返回拷贝后的新对象</returns>
        public static T CloneOf<T>(T serializableObject)
        {
            object objCopy = null;
            MemoryStream stream = new MemoryStream();
            BinaryFormatter binFormatter = new BinaryFormatter();
            binFormatter.Serialize(stream, serializableObject);
            stream.Position = 0;
            objCopy = (T)binFormatter.Deserialize(stream);
            stream.Close();
            return (T)objCopy;
        } 
        #endregion

最后获取缓存的方法如下:

/// <summary>
        /// 得到一个对象实体
        /// </summary>
        public Model.article_news GetNewsModel(int id)
        {
            string key = "getmo" + id.ToString();
            object objModel = CacheHelper.Get(key);
            if (objModel == null)
            {
                objModel = dal.GetNewsModel(id);
                if (objModel != null)
                {
                    CacheHelper.Insert(key, objModel, 10);
                }
            }
            Model.article_news model = (Model.article_news)objModel;
            Model.article_news model2 = Utils.CloneOf<Model.article_news>(model);
            return model2;
        }

发现我根本就不懂C# !

posted on 2013-07-31 22:58  LitDev  阅读(412)  评论(0编辑  收藏  举报