0

我对使用 Polly 项目中的缓存策略感到茫然。我已经根据示例进行了所有设置,并且基本上似乎可以正常工作。

我编写了一个单元测试,其中成功检索了值,将其放入缓存并在以后的调用中从缓存中读取。但是,当我在 asp.net 核心上下文中运行代码时,它没有按预期工作。执行包装的操作并检索值。但是,永远不会执行 put to cache 方法。我尝试使用自己的 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;
}

任何想法,什么可能导致这种行为?当我放置断点时,它永远不会尝试将返回值添加到缓存中。也不例外。

4

1 回答 1

1

我想我在源代码中找到了答案。

在类 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 作为返回值,因此缓存起作用了。

于 2018-10-21T20:22:38.440 回答