我有.net core 2.0 Web Api项目。我有10个Web Api和一个类库项目。我想缓存一些数据。因此,我在类库中创建了CacheHelper.cs
。然后在Web api项目中注入Startup.cs
。我想在webapi项目启动并进入控制器中的任何位置时调用SetCommonCacheItems。但是,当我调用GetCities函数时,返回null。有什么问题吗?
CacheHelper.cs(在类库项目中)
public class CacheHelper : ICacheHelper
{
private readonly IUnitOfWork unitOfWork;
MemoryCache cache = new MemoryCache(new MemoryCacheOptions());
public CacheHelper(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public void SetCommonCacheItems()
{
var cities= unitOfWork.CityRepo.GetAll();
cache.Set("city", cities);
}
public string GetCities()
{
string obj;
cache.TryGetValue<string>("city", out obj);
return obj;
}
}
Startup.cs(在Web API项目中)
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddScoped<IJwtHelper, JwtHelper>();
services.AddScoped<IAuditHelper, AuditHelper>();
services.AddMemoryCache();
services.AddScoped<ICacheHelper, CacheHelper>();
services.AddMvc();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
最佳答案
正如services.AddMemoryCache();
这样的MemoryCache
寄存器services.TryAdd(ServiceDescriptor.Singleton<IMemoryCache, MemoryCache>());
一样,这意味着高速缓存在单例范围内,并且在请求完成后将不进行处理。
但是在CacheHelper
中,您是通过构造函数创建的MemoryCache
,并且在请求完成后立即处置CacheHelper
时,您的缓存将丢失。
要更改此行为,您有2个选项:
将“ IMemoryCache”依赖项添加到CacheHelper
:public CacheHelper(IMemoryCache cache, IUnitOfWork unitOfWork) {}
将CacheHelper
设为单例:services.AddScoped<ICacheHelper, CacheHelper>();