c#更新缓存对象而不更新缓存

时间:2014-01-02 10:40:30

标签: c# c#-4.0 caching

我有一个我从缓存中检索的模型,我在几个页面上使用它。该模型的一部分有一个名为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,然后将每个属性与缓存模型分开重新分配,但是如果我每次都必须重新分配所有属性,这肯定不需要缓存。是否有更简单的方法来更新缓存对象而不更新缓存本身?

1 个答案:

答案 0 :(得分:0)

我认为您正在将对象的引用与对象混合。从缓存中检索模型时,实际上只获得对缓存引用的同一对象的另一个引用。因此,通过您的参考所做的任何更改也将通过任何其他参考文献可见。

有两种方法可以避免这种情况:

  1. 从缓存中克隆复制模型实例。这将需要实施方面的协助。请记住,这需要是一个深层副本,模型的任何属性和字段本身都是引用,也需要复制引用的对象。递归。

  2. 不要将面包屑放在模型中。如果同一模型的差异使用需要此属性的不同值,则它不属于模型。

  3. (还有使用值类型的选项 - 复制而不是引用 - 但良好的做法是(1)值类型应该小(不是很多字段),以及(2)不可变。)

    Model model = GetCachedModel();
    Model tempModel = new Model();
    tempModel = model;
    

    那不行。您正在创建对新实例(tempModel)的引用,然后使用对缓存中原始引用的引用来覆盖该引用。