问题中所述的设计符合要求:为每个要视为具有不同健康状态的下游系统维护一个单独的断路器策略实例。
Polly 不提供一个断路器,它为每个键维护一个庞大的内部健康状态字典。
Polly 确实提供了PolicyRegistry;这基本上是一个类似于问题中描述的关键策略字典。
如果需要在PolicyWrap 中使用断路器策略,并且是PolicyWrap 中唯一需要针对每个租户进行更改的内容,您可以使用'policy selector' within the PolicyWrap 在运行时选择或制造适当的策略.
以上链接中的示例代码:
public class AsyncPolicySelector<TResult> : AsyncPolicy<TResult>
{
private readonly Func<Context, IAsyncPolicy<TResult>> policySelector;
public static AsyncPolicySelector<TResult> Create(Func<Context, IAsyncPolicy<TResult>> policySelector)
{
return new AsyncPolicySelector<TResult>(policySelector);
}
private AsyncPolicySelector(Func<Context, IAsyncPolicy<TResult>> policySelector)
{
this.policySelector = policySelector;
}
protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
return policySelector(context).ExecuteAsync(action, context, cancellationToken, continueOnCapturedContext);
}
}
使用Func<Context, IAsyncPolicy<TResult>> policySelector 为您创建自定义AsyncPolicySelector<TResult> 策略,该策略可以选择以前的策略或重新(在需要时)制造策略。
Polly Context has dictionary semantics 这样您就可以在执行之前在 Context 上设置租户 ID。
Context context = new Context();
context["TenantId"] = /* tenant id from somewhere */
// (you must execute through the PolicyWrap then with an overload passing in this context)
并使用Func<Context, IAsyncPolicy<TResult>> policySelector 从您的字典中通过context["TenantId"] 或PolicyRegistry 检索断路器;或为该租户制造一个新的断路器(如果还没有的话)。