如何将 Polly 策略添加到使用工厂创建的 Refit Client?

How do I add a Polly policy to a Refit Client created with a factory?

我有一个改装客户端 (IMyRefitClient) returns

Task<ApiResponse<ADomainModel>>

我无法使用 HostBuilder.ConfigureServices 在 program.cs 中注入此改装客户端,因为 url 直到运行时才知道。因此,我使用的工厂 class 如:

return RestService.For<IMyRefitClient>(hostUrl);

我知道如何在 ConfigureServices 中添加策略。它看起来像:

services.AddRefitClient<IMyRefitClient>()
            .AddPolicyHandler(PollyHelpers.GetRetryPolicy());

有没有办法在使用工厂时添加此策略class?

Polly有一个PolicyRegister的概念,基本上就是一个IEnumerable<KeyValuePair<string, IsPolicy>>集合。

因此,它是一个容器,您可以在其中注册具有任意名称的策略:

var register = new PolicyRegistry()
{
    { "CB_aware_Retry", GetRetryPolicy() },
    { "500_aware_CB", GetCircuitBreakerPolicy() },
    { "Retry_CB_combined", Policy.WrapAsync(GetRetryPolicy(), GetCircuitBreakerPolicy()) }
};

ServiceCollection you can register 新容器或现有容器上:

services.AddPolicyRegistry(registry)

您可以通过 IReadOnlyPolicyRegistry:

访问策略
public class MyRefitClient 
{
    private readonly IAsyncPolicy<ApiResponse<ADomainModel>>> combined;
    public MyRefitClient(..., IReadOnlyPolicyRegistry<string> registry, ...)
    {
       ...
       combined = registry.Get<IAsyncPolicy<ApiResponse<ADomainModel>>>>("Retry_CB_combined");
    } 
}