为啥要在 ASP.Net Core 中获取多个 IMemoryCache 实例?

Posted

技术标签:

【中文标题】为啥要在 ASP.Net Core 中获取多个 IMemoryCache 实例?【英文标题】:Why getting multiple instances of IMemoryCache in ASP.Net Core?为什么要在 ASP.Net Core 中获取多个 IMemoryCache 实例? 【发布时间】:2017-08-03 04:16:43 【问题描述】:

我相信 IMemoryCache 在我的 ASP.NET Core 应用程序中的标准用法。

在 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 包含不同的条目。

【问题讨论】:

你是如何测试它的?你能分享更多代码吗? @levent 更新问题 我今天在 ASP.NET Core 2 中也看到了这一点。非常不寻常的行为。注入某些控制器的IMemoryCache 实例与注入其他控制器的实例不同。奇怪。 啊!但我想要多个IMemoryCache 实例!不同的数据有不同的规则! 【参考方案1】:

多次创建 IMemoryCache 的原因是您的 RoleService 很可能获得作用域依赖。

要修复它,只需添加一个包含内存缓存的新单例服务,并在需要时注入而不是 IMemoryCache:

// Startup.cs:

services.AddMemoryCache();
services.AddSingleton<CacheService>();

// CacheService.cs:

public IMemoryCache Cache  get; 

public CacheService(IMemoryCache cache)

  Cache = cache;


// RoleService:

private CacheService cacheService;
public RoleService(CacheService cacheService)

    this.cacheService = cacheService;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于为啥要在 ASP.Net Core 中获取多个 IMemoryCache 实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BackgroundService 获取 ASP.NET Core 启动地址

如何在 ASP.NET Core API 控制器中获取多个表的记录

如何正确解析要在 ASP.NET Core 3.1 的 ConfigureServices() 中使用的服务?

2021最新春招ASP.NET Core笔试题附答案

TSQL 多个连接与来自 ASP.NET Core 的多个请求?

为啥 Asp.net Core 无法读取 Ajax 参数?