3

我创建了一个视图模型,然后返回到我的视图。此视图模型未缓存。但是,视图模型包含缓存的“类别”类型列表。

我执行通常的“如果在缓存中检索并返回。如果不在缓存中则检索数据,存储在缓存中并将视图模型返回”给控制器。这按预期工作。

我的问题是在我将视图模型从控制器返回到视图之前,我想更新类别列表中的记录,但仅适用于调用它的页面(不适用于调用它的所有用户/页面)。当我这样做时,它会自动更新缓存中的类别列表,我不希望它这样做。我只插入一次缓存,所以不明白为什么当我从缓存中检索到列表后更新列表时,更改会立即反映在缓存中。

这可能是我误解了 OO / Cache 的工作原理,但我希望有人可以让我直截了当吗?

我控制器中的代码...

var vm = new FsmViewModel();
if(vm.ActiveCategoryId > 0)
vm.Categories.Find(c => c.Category_ID == vm.ActiveCategoryId).ActiveBootstrapCss = "active";

上面的代码还更新了我存储在缓存中的类别列表?我正在使用代理模式从缓存或数据库中填充类别列表。

ObjectCache cache = MemoryCache.Default;
_categories = (List<Category>)cache[CacheForCategories];

if (_categories != null) return _categories;

// Cache does not exist so create
var policy = new CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.Now.AddHours(4)};

_categories = base.GetAllCategories();
cache.Add(CacheForCategories, _categories, policy);

return _categories;

_categories 返回到从缓存或数据库中提取的视图模型,并在我的视图模型对象中定义为

public List<Category> Categories { get; set; }

有人可以让我知道我在这里做错了什么吗?

谢谢,

保罗

4

1 回答 1

5

你没有做错任何事。这就是缓存开箱即用的方式。它包含对对象的引用,而不是它的副本。因此,如果您从缓存中加载一个对象,那么它基本上是同一个对象,因为您只会收到对它的引用。

您可以在将对象保存到缓存之前对其进行深层复制,以避免这种行为。

于 2014-10-06T18:36:57.393 回答