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

MemoryCache with AbsoluteExpiration stored in an IOC container using .SingleInstance()

我对 MemoryCache 进行了抽象,此实例使用 AbsoluteExpiration 作为其 CacheItemPolicy 并由 Autofac 管理如下:

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

理论上我希望项目绝对过期(例如 15 分钟后)。

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

有什么解决办法?我是否需要连接到某个事件或其他...?

缓存项目策略以每个项目为基础。添加一个项目,它会在 15 分钟后过期(根据您的项目政策)。没有 "reset" 或任何要求。它不像计时器或信号量那样工作 - 添加内容,缓存处理其余部分。

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

我的问题是我需要指定缓存键过期的特定时间点:

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)

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

现在对我有用:

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

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