.NET EF Core集成In-Memory Cache实现假期判断时抛出错误如何修复?
错误原因与修复方案
你截图中的空引用错误是因为IMemoryCache实例没有被正确注入到控制器,调用TryGetValue时memoryCache为null导致的,按以下步骤修复:
- 首先注册内存缓存服务:
- .NET 6+ 版本在
Program.cs中添加配置:builder.Services.AddMemoryCache(); - .NET 5及更早版本在
Startup.cs的ConfigureServices方法中添加配置:services.AddMemoryCache();
- .NET 6+ 版本在
- 完善控制器构造函数的注入赋值:
你当前只声明了IMemoryCache私有字段,没有在构造函数中对字段赋值,修改构造函数如下:public CustomersController(SurplusMouseContext context, IMemoryCache memoryCache) { _context = context; this.memoryCache = memoryCache; }
缓存逻辑优化建议
你当前的缓存实现存在跨天判断错误的风险,建议做如下调整:
- 把滑动过期策略改为绝对过期到美东时间当日23:59:59,避免前一天生成的缓存跨天后依然生效,导致节假日判断错误:
var expireTime = new DateTime(todayDt.Year, todayDt.Month, todayDt.Day, 23, 59, 59); var cacheEntryOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(expireTime); - 优化EF查询逻辑,不需要统计所有匹配的节假日数量,只要判断是否存在即可,异步查询也符合你方法的
async声明:holidaycheck = await _context.HolidayWeeks.AnyAsync(hc => hc.HolidateDate.Date == todayDt.Date) ? 1 : 0;
Remove()方法调用时机
你的业务场景下绝大多数情况不需要主动调用Remove()方法,缓存会在当日结束后自动过期失效。只有当你在后台手动修改了当日的节假日配置数据时,才需要主动调用memoryCache.Remove("HolidayWk")清除缓存,让最新的节假日配置立即生效,不需要等待缓存过期。
内容的提问来源于stack exchange,提问作者user4912134
相关产品推荐
相关产品推荐

