我有.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”依赖项添加到CacheHelperpublic CacheHelper(IMemoryCache cache, IUnitOfWork unitOfWork) {}
CacheHelper设为单例:services.AddScoped<ICacheHelper, CacheHelper>();

09-25 17:48