【问题标题】:MemoryCache with AbsoluteExpiration stored in an IOC container using .SingleInstance()使用 .SingleInstance() 将具有 AbsoluteExpiration 的 MemoryCache 存储在 IOC 容器中
【发布时间】:2016-07-22 14:11:24
【问题描述】:

我对@9​​87654321@ 有一个抽象,此实例使用AbsoluteExpiration 作为其CacheItemPolicy,并由Autofac 管理如下:

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

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

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

解决办法是什么?我是否需要挂钩某个事件或其他什么...?

【问题讨论】:

  • 你能把MyCache的代码贴出来吗?

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


【解决方案1】:

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

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

【讨论】:

  • 是的,但我的问题是我需要指定缓存密钥过期的某个时间点:AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)。缓存策略设置在私有只读字段中,该字段仅在创建MyCache 的实例时才被初始化,但这仅在应用程序启动时发生(IOC 容器,单实例)。这对我有用:private CacheItemPolicy CachePolicy =&gt; new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)... };。每次访问缓存项策略时,都会计算一个新的 DateTimeOffset。
【解决方案2】:

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

AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(15)

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

现在这对我有用:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多