You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:21