我有一个返回
的改装客户端(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");
}
}