如何向Polly的Fallback策略传入Request参数以解决编译报错
问题根源
- 你当前使用的是非泛型
Policy类,其Fallback方法的默认入参是CancellationToken类型,无法直接接收你自定义的Request参数 - 你现有代码中
_policy.Execute( GetResponse(request))的写法存在逻辑错误:该写法会先直接执行GetResponse(request)拿到返回值再传入策略,策略完全没有包裹执行逻辑,自然也不会触发降级
修复方案
推荐两种可行的写法,你可以根据场景选择:
写法1:简化逻辑直接包裹执行(适合简单降级场景)
不需要在策略定义阶段处理参数,直接在执行方法内把主执行逻辑和降级逻辑都用lambda包裹,写法最直观:
private IExecuter primary; private IExecuter secondary; private readonly Policy _policy; public Client() { primary = new Executer("primary"); secondary = new Executer("secondary"); // 策略仅定义触发降级的异常条件 _policy = Policy .Handle<Exception>(); } public Response Process(Request request) { // 把执行逻辑全部包裹在Execute的lambda内 return _policy.Execute(() => { return primary.Execute(request); }, () => GetResponseFallback(request)); } private Response GetResponseFallback(Request request) { return secondary.Execute(request); }
写法2:使用Polly Context传递参数(符合Polly原生规范)
如果需要严格遵循Polly的设计规范,用Context容器传递自定义参数:
private IExecuter primary; private IExecuter secondary; private readonly Policy _policy; public Client() { primary = new Executer("primary"); secondary = new Executer("secondary"); _policy = Policy .Handle<Exception>() // 从Fallback的Context参数中取出预先存入的Request .Fallback((context) => GetResponseFallback((Request)context["request"])); } public Response Process(Request request) { // 构造Context存储当前请求参数 var context = new Context(); context["request"] = request; // 传入Context执行主逻辑 return _policy.Execute(ctx => primary.Execute((Request)ctx["request"]), context); } private Response GetResponseFallback(Request request) { return secondary.Execute(request); }
两种写法都可以解决编译报错,正常触发主执行器失败后调用备用执行器的降级逻辑。
内容的提问来源于stack exchange,提问作者Buda Gavril
相关产品推荐
相关产品推荐

