我对使用 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;
}
任何想法,什么可能导致这种行为?当我放置断点时,它永远不会尝试将返回值添加到缓存中。也不例外。