Создайте глобальное кэширование в библиотеке классов на .net core 2.0 - PullRequest
0 голосов
/ 24 октября 2018

У меня есть проект .net core 2.0 Web Api. У меня есть 10 веб-API и один проект библиотеки классов.Я хочу кешировать некоторые данные.Поэтому я создаю CacheHelper.cs в библиотеке классов.И я вводить Startup.cs в проектах веб-API.Я хочу вызвать SetCommonCacheItems, когда проект webapi запускается и попадает куда-нибудь в мой контроллер.Но когда я вызываю функцию GetCities, возвращаю ноль.В чем может быть проблема?

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>();
    }

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Как 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>();
0 голосов
/ 24 октября 2018

Это потому, что вы используете свой кеш в качестве «ограниченного» сервиса, что означает, что для каждого запроса фреймворк будет создавать новый объект кеша, а тот, который вы установили при запуске приложения, будет потерян.

Попробуйтеэто:

services.AddSingleton<ICacheHelper, CacheHelper>();

Важно: Это нарушит вашу единицу работы, так как она будет также одиночной в вашем кэше.

Я рекомендую не использовать единицу работы внутри кеша, вместо этого просто передать результаты вашего репо в SetCommonCacheItems () в качестве аргумента.

Редактировать: Или вы можете использовать встроенную кэш-память 1015 *.В этом случае вам не нужно использовать ваш кеш-помощник в качестве одиночного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...