如何将 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");
}
}
我有一个改装客户端 (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");
}
}