Политика кэширования Polly не добавляет значения в кэш - PullRequest
0 голосов
/ 21 октября 2018

Я в недоумении с использованием политики кэширования из проекта Полли.Я настроил все в соответствии с примерами, и в принципе это похоже на работу.

Я написал модульный тест, в котором значение успешно извлекается, помещается в кеш и читается из кеша позже.вызовы.Однако когда я запускаю код в основном контексте asp.net, он работает не так, как ожидалось.Завершенное действие выполняется, и значение извлекается.Однако метод «положить в кэш» никогда не выполняется.Я попытался использовать свой собственный IAsyncCacheProvider для устранения проблемы.И его метод PutAsync никогда не вызывается в контексте asp.net.Однако он вызывается при запуске в модульном тесте.

Здесь конфигурация моей службы

services.AddSingleton<IAsyncCacheProvider, MemoryCacheProvider>();
services.AddSingleton<IPolicyRegistry<string>, PolicyRegistry>();

А вот выдержки из класса, вызывающего проблемы.

public Bar(
            IPolicyRegistry<string> policyRegistry,
            IService service,
            IAsyncCacheProvider cacheProvider)
{
     this.policyRegistry = policyRegistry;
     this.service = service;
     this.cacheProvider = cacheProvider;
}

 public Task<bool> Foo(Guid id)
 {
    var cachePolicy = this.GetPolicy();

    return cachePolicy.ExecuteAsync(
           _ => this.service.Foo(id),
           new Context("policyKey" + id));
 }


private CachePolicy<bool> GetPolicy()
{
    if(!this.policyRegistry.TryGet(PolicyKey, out CachePolicy<bool> policy))
    {
         policy = Policy.CacheAsync<bool>(
         this.cacheProvider.AsyncFor<bool>(),
         TimeSpan.FromMinutes(5),
         (c, s) => { },
         (c, s) => { },
         (c, s) => { },
         (c, s, e) => { },
         (c, s, e) => { });

         this.policyRegistry.Add(PolicyKey, policy);
   }

   return policy;
}

Есть идеи, что может вызвать такое поведение?Когда я ставлю точки останова, он никогда не пытается добавить возвращаемое значение в кеш.Там нет никаких исключений либо.

1 Ответ

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

Я думаю, что нашел ответ в исходном коде.

В классе CacheEngine есть следующий код.

if (ttl.Timespan > TimeSpan.Zero && result != null && !result.Equals(default(TResult)))
  {
  try
  {
      await cacheProvider.PutAsync(cacheKey, result, ttl, cancellationToken, continueOnCapturedContext).ConfigureAwait(continueOnCapturedContext);
      onCachePut(context, cacheKey);
  }
  catch (Exception ex)
  {
       onCachePutError(context, cacheKey, ex);
  }
}

Поэтому всякий раз, когда возвращается значение этой службы, котороеbool, бывает false, он не помещается в кеш, потому что на самом деле это значение по умолчанию для типа.В модульном тесте я использовал true в качестве возвращаемого значения, поэтому кеш работал.

...