2016-07-22 198 views
0

我有过MemoryCache一个抽象的IOC容器,这种情况下使用AbsoluteExpirationCacheItemPolicy,由Autofac如下管理:的MemoryCache与AbsoluteExpiration存储在使用.SingleInstance()

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

理论上我想要的项目完全失效(例如在15分钟内)。

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

这是什么解决方案?我需要勾选一个事件或...?

+1

你可以发布MyCache的代码? –

回答

0

我的问题是,我需要时间来指定某一点在高速缓存密钥过期:

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15) 

缓存政策被设置在private readonly field只创造MyCache实例时被初始化,但是这只发生在应用程序启动(IoC容器,单实例)上。

现在,这对我的作品:

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

每次缓存项政策被访问,计算新的DateTimeOffset

1

缓存项目策略以每个项目为基础工作。添加一个项目,15分钟后过期(根据您的物品政策)。没有“重置”或任何要求。它不像计时器或信号量那样工作 - 添加东西,缓存处理剩下的东西。

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

+0

是的,但我的问题是我需要指定缓存键过期的某个时间点:'AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)'。缓存策略是在私有只读字段中设置的,只有在创建“MyCache”实例时才初始化,但这只发生在应用程序启动(IOC容器,单实例)上。这现在适用于我:'私人CacheItemPolicy CachePolicy =>新CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)...};'。每次访问缓存项目策略时,都会计算一个新的DateTimeOffset。 – timmkrause