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



我有一个返回

的改装客户端(IMyRefitClient)
Task<ApiResponse<ADomainModel>>

我不能用HostBuilder.ConfigureServices在Program.cs中注入这个改装客户端,因为直到运行时才知道url。因此,我使用的是像

这样的工厂类:
return RestService.For<IMyRefitClient>(hostUrl);

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

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

是否有一种方法可以在使用工厂类时添加此策略?

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上,您可以注册一个新的容器或一个现有的容器:

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");
} 
}    

最新更新