为什么在ASP.Net Core中获取IMemoryCache的多个实例?

时间:2017-03-13 07:51:37

标签: c# dependency-injection asp.net-mvc-5.1 memorycache

我认为我的ASP.NET Core应用程序中的IMemoryCache的标准用法。

在startup.cs中我有:

services.AddMemoryCache();

在我的控制器中,我有:

private IMemoryCache memoryCache;
public RoleService(IMemoryCache memoryCache)
{
    this.memoryCache = memoryCache;
}

然而,当我进行调试时,我最终得到了多个内存缓存,每个缓存中包含不同的项目。我以为内存缓存会是单例吗?

更新了代码示例:

public List<FunctionRole> GetFunctionRoles()
{
    var cacheKey = "RolesList";
    var functionRoles = this.memoryCache.Get(cacheKey) as List<FunctionRole>;
    if (functionRoles == null)
    {
         functionRoles = this.functionRoleDAL.ListData(orgId);
         this.memoryCache.Set(cacheKey, functionRoles, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromDays(1)));
    }
}

如果我在两个不同的浏览器中运行两个客户端,当我点击第二行时,我可以看到this.memoryCache包含不同的条目。

2 个答案:

答案 0 :(得分:1)

我没有找到理由。但是,在进一步阅读后,我使用内存中的分布式缓存从IMemoryCache交换到IDistributedCache,问题不再发生。如果我以后需要多台服务器,我认为这条路线可以让我轻松更新到redis服务器。

答案 1 :(得分:0)

多次创建IMemoryCache的原因是您的RoleService最有可能获得范围依赖。

要解决此问题,只需添加一个新的单例服务即可,该服务包含内存缓存并在需要时注入(而不是IMemoryCache):

indicator