使用.SingleInstance()将AbsoluteExpiration存储在IOC容器中的MemoryCache

时间:2016-07-22 14:11:25

标签: c# asp.net-mvc caching autofac memorycache

我对MemoryCache有一个抽象,这个实例使用AbsoluteExpiration作为CacheItemPolicy,并由Autofac管理,如下所示:

builder
    .RegisterType<MyCache>()
    .As<IMyCache>()
    .SingleInstance()
    .WithParameter("cacheName", "MyCache");

理论上我希望这些物品绝对过期(例如在15分钟内)。

问题(问题)是,它是一个超过所有请求的单个实例,并且没有适当的机制可以将到期时间再次重置为15分钟。 所以刷新只会发生一次,对吧?

这是什么解决方案?我是否需要挂钩事件或什么......?

2 个答案:

答案 0 :(得分:1)

缓存项目策略适用于每个项目。添加一个项目,它会在15分钟后过期(根据您的项目政策)。没有“重置”或任何需要的东西。它不像计时器或信号量那样工作 - 添加东西,缓存处理其余部分。

您可以通过使政策足够短(一分钟?)来添加内容并等待来测试这一点。

答案 1 :(得分:0)

我的问题是我需要指定缓存密钥到期的某个时间点:

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)

缓存策略是在private readonly field中设置的,只有在创建MyCache实例时才会初始化,但这只发生在应用程序启动时(IoC容器,单个实例)。

现在这对我有用:

private CacheItemPolicy CachePolicy => new CacheItemPolicy
{
    AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)
};

每次访问缓存项策略时,都会计算新的DateTimeOffset