当启动我的应用程序时,我正在将许多配置参数加载到MemoryCache中,我可以确认在这样做之后(在Startup.cs中),缓存中大约有280个条目。
当我注入一个IMemoryCache到一个控制器,并返回json的所有条目,突然只有16项在里面,他们不是我最初加载的那些。
发生这种情况的原因是什么?我一直在找可以清除藏匿物的地方但没有找到。immemorycache没有实现为单例吗?
在Startup。我正在添加内存缓存作为第一个语句之一:
services.AddMemoryCache();
我最初是这样加载项目的:
var spp = services.BuildServiceProvider().GetRequiredService<ISysParamProvider<IDbContext>>();
spp.LoadAll();
问题可能是,这里建立了一个新的ServiceProvider ?如果是这样,我怎么能得到ISysParamProvider实例代替?
我是否需要考虑其他事情,以便将这个实例注入到控制器中?
Thanks in advance
LoadAll()方法是这样的:
public async Task LoadAll()
{
var sysParams= this.db.Set<SysParam>().ToList();
foreach (var sysParam in sysParams)
{
if (!this.cache.TryGetValue(sysParam.ParamName, out _))
{
var cacheentryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromDays(1));
this.cache.Set(sysParam.ParamName, sysParam.ParamValue, cacheentryOptions);
}
}
}
问题确实是与services.BuildServiceProvider().GetRequiredService<ISysParamProvider<IDbContext>>();
,因为它似乎已经创建了IMemoryCache的另一个实例(在ISysParamProvider中注入)。
解决方法是将ISysParamProvider
注入Startup的Configure
方法中,并通过spp.LoadAll()
填充那里的缓存。通过这样做,正确的IMemoryCache
被注入ISysParamProvider
。