【问题标题】:c# update cached object without updating cachec# 更新缓存对象而不更新缓存
【发布时间】:2014-01-02 10:40:30
【问题描述】:

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

【问题讨论】:

    标签: c# c#-4.0 caching


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 不幸的是我没有创建对象(或决定缓存它们)。我决定走克隆路线
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多