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

.NET Core 3.1 API 如何调用HttpService构造函数使用已注册MemoryCache

问题根源

你当前的写法每次都手动实例化新的MemoryCache、TokenService、HttpService对象,和你在Startup.cs中注册的全局单例服务完全独立,每次新实例的缓存都是空的,自然无法读取到之前存储的令牌。

解决方案

场景1:在Controller/已被DI托管的服务中使用

这是.NET Core API最常见的使用场景,操作步骤如下:

  1. 先在Startup.cs的ConfigureServices方法中注册HttpService到DI容器:
services.AddMemoryCache();
services.AddSingleton<ITokenService, TokenService>();
// 新增这行注册HttpService
services.AddSingleton<HttpService>();
  1. 在需要使用HttpService的位置,直接通过构造函数声明依赖即可,DI容器会自动注入已经初始化好的全局唯一实例,示例如下:
[ApiController]
[Route("api/[controller]")]
public class DemoController : ControllerBase
{
    private readonly HttpService _httpService;

    // 框架会自动传入DI容器中管理的HttpService实例,不需要手动构造
    public DemoController(HttpService httpService)
    {
        _httpService = httpService;
    }

    [HttpGet("test")]
    public string Test()
    {
        // 直接调用即可,缓存会正常生效
        return _httpService.GetReadersFromExternalApi("你的第三方接口地址");
    }
}

场景2:在非DI托管的代码中手动获取实例

如果是在中间件、Main方法等无法通过构造函数注入的场景,可以从IServiceProvider中获取容器托管的实例:

// 示例:在Main方法中获取
public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();
    // 从根服务容器获取HttpService实例,所有依赖都是全局共享的
    var httpService = host.Services.GetRequiredService<HttpService>();
    // 执行业务逻辑
    host.Run();
}
// 示例:在能拿到HttpContext的场景中获取
var httpService = httpContext.RequestServices.GetRequiredService<HttpService>();

注意事项

  • 所有依赖DI容器服务的类都不要手动new实例,统一交给DI容器管理才能保证单例服务的全局唯一性
  • 手动new MemoryCache(new MemoryCacheOptions())生成的是独立的缓存实例,和DI容器中注册的全局缓存完全无关,无法共享数据

内容的提问来源于stack exchange,提问作者Steen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:24:04