我有一个我从缓存中检索的模型,我在几个页面上使用它。该模型的一部分有一个名为Breadcrumb的属性 - 它是面包屑元素的集合,并且更新如下:
model.Breadcrumbs.Add(UrlUtilities.Urls.DesignerJoinConfirmation, "Feedback Confirmation", "Thank you for your feedback");
我的问题是,即使我从缓存中获取模型,当我从缓存中返回后添加另一个痕迹(例如,对于子页面,我会将最新页面添加到末尾),然后是更新缓存的模型。有没有更新模型而不更新缓存的方法?
我尝试创建临时模型并将缓存对象重新分配给它:
Model model = GetCachedModel();
Model tempModel = new Model();
tempModel = model;
然后更新tempModel,但这也会更新缓存的对象。我发现停止缓存对象更新的唯一方法是创建tempModel,然后将每个属性与缓存模型分开重新分配,但是如果我每次都必须重新分配所有属性,这肯定不需要缓存。是否有更简单的方法来更新缓存对象而不更新缓存本身?
答案 0 :(得分:0)
我认为您正在将对象的引用与对象混合。从缓存中检索模型时,实际上只获得对缓存引用的同一对象的另一个引用。因此,通过您的参考所做的任何更改也将通过任何其他参考文献可见。
有两种方法可以避免这种情况:
从缓存中克隆复制模型实例。这将需要实施方面的协助。请记住,这需要是一个深层副本,模型的任何属性和字段本身都是引用,也需要复制引用的对象。递归。
不要将面包屑放在模型中。如果同一模型的差异使用需要此属性的不同值,则它不属于模型。
(还有使用值类型的选项 - 复制而不是引用 - 但良好的做法是(1)值类型应该小(不是很多字段),以及(2)不可变。)
Model model = GetCachedModel(); Model tempModel = new Model(); tempModel = model;
那不行。您正在创建对新实例(tempModel
)的引用,然后使用对缓存中原始引用的引用来覆盖该引用。