.NET Core 3.1 API 如何调用HttpService构造函数使用已注册MemoryCache
问题根源
你当前的写法每次都手动实例化新的MemoryCache、TokenService、HttpService对象,和你在Startup.cs中注册的全局单例服务完全独立,每次新实例的缓存都是空的,自然无法读取到之前存储的令牌。
解决方案
场景1:在Controller/已被DI托管的服务中使用
这是.NET Core API最常见的使用场景,操作步骤如下:
- 先在
Startup.cs的ConfigureServices方法中注册HttpService到DI容器:
services.AddMemoryCache(); services.AddSingleton<ITokenService, TokenService>(); // 新增这行注册HttpService services.AddSingleton<HttpService>();
- 在需要使用
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
相关产品推荐
相关产品推荐

