IMemoryCache跨项目存值后无法读取的问题求助
问题原因分析
核心问题是缓存实例不共享:
- 在第二个项目的
AddIntoMemoryCache扩展方法中,调用serviceCollection.BuildServiceProvider()创建了临时服务提供者,其内部的IMemoryCache是全新的独立实例。 - 你往这个临时缓存实例存入的值,和第一个项目后续构建的服务提供者中的
IMemoryCache完全无关,自然读不到数据。
解决方案
1. 修改第二个项目的扩展方法,用启动服务初始化缓存
不要在服务注册阶段构建临时服务提供者,而是注册IHostedService,在应用启动时使用全局共享的缓存实例写入数据:
public static class ServiceCollectionExtension { public static void AddIntoMemoryCache(this IServiceCollection serviceCollection) { // 注册缓存初始化的启动服务 serviceCollection.AddHostedService<CacheInitializer>(); } // 内部类,实现IHostedService完成缓存初始化 private class CacheInitializer : IHostedService { private readonly IMemoryCache _memoryCache; public CacheInitializer(IMemoryCache memoryCache) { _memoryCache = memoryCache; } public Task StartAsync(CancellationToken cancellationToken) { // 这里的IMemoryCache是应用全局共享的单实例 _memoryCache.Set(1, 1, TimeSpan.FromMinutes(10)); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } } }
2. 第一个项目正确读取缓存
不要手动调用BuildServiceProvider创建新的服务提供者,而是通过应用的依赖注入体系获取缓存实例:
方式一:在控制器/服务中依赖注入(推荐)
public class DemoController : ControllerBase { private readonly IMemoryCache _cache; // 通过构造函数注入全局共享的缓存实例 public DemoController(IMemoryCache cache) { _cache = cache; } public IActionResult GetCachedValue() { if (_cache.TryGetValue(1, out int value)) { return Ok(value); // 可以读取到值1 } return NotFound(); } }
方式二:在Program.cs中读取(仅用于启动时验证)
var app = builder.Build(); // 构建应用后,通过应用的服务容器获取实例 using var serviceScope = app.Services.CreateScope(); var cache = serviceScope.ServiceProvider.GetRequiredService<IMemoryCache>(); var cachedValue = cache.Get<int>(1); // 能获取到正确的值
关键注意点
AddMemoryCache默认将IMemoryCache注册为单例服务,只要是通过同一服务提供者获取的实例,都是同一个对象。- 禁止在服务注册阶段(比如扩展方法中)调用
BuildServiceProvider,这会创建孤立的服务实例,破坏依赖注入的生命周期管理。
内容的提问来源于stack exchange,提问作者Kotletmeknow
相关产品推荐
相关产品推荐

