用于Xamarin.Forms的Prism上的AddRefitClient DryIoc和IServiceProvider

问题描述

我正在尝试关注DryIoc and IServiceProvider on Prism for Xamarin.Forms (DryIoc.Microsoft.DependencyInjection),但是我正在将RefitClient用于IHttpClientFactory

containerRegistry.RegisterServices(services =>
            {
                services.AddTransient<HttpLoggingHandler>();
                services.AddTransient<AuthorizationDelegatingHandler>();

                services.AddRefitClient<IMyApi>()
                    .ConfigureHttpClient(c =>
                        c.BaseAddress =
                            new Uri(apiBaseUrl))
                    .AddHttpMessageHandler<AuthorizationDelegatingHandler>()
                    .AddHttpMessageHandler<HttpLoggingHandler>()
                    .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
                    {
                        TimeSpan.FromMilliseconds(300),TimeSpan.FromSeconds(600),TimeSpan.FromSeconds(800)
                    }))
                    .AddTransientHttpErrorPolicy(
                        p => p.CircuitBreakerAsync(5,TimeSpan.FromSeconds(30)));
            });

添加

protected override IContainerExtension CreateContainerExtension() => PrismContainerExtension.Current;

当我尝试向IMyApi发出请求时。

BaseAddress must be set on the HttpClient instance
  at Refit.RequestBuilderImplementation+<>c__displayClass14_0`2[T,TBody].<BuildCancellableTaskFuncForMethod>b__0 (System.Net.Http.HttpClient client,System.Threading.CancellationToken ct,System.Object[] paramList) [0x00030] in /_/Refit/RequestBuilderImplementation.cs:236

解决方法

我个人不得不处理所有这些问题,最后创建了Apizr,其中内置了身份验证和日志处理程序,可以从注册表中解析策略,还可以进行连接测试,缓存或优先级等更多功能。如果可以的话。

,

我使用的是 Unity 而不是 Dryloc,但解决方案是一样的。

关键似乎很大程度上取决于安装正确的软件包。 安装这些:

Prism.Forms.Extended

Prism.Unity.Extensions

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    //Omitted Code

    containerRegistry.RegisterServices(serviceCollection =>
    {
        serviceCollection.AddHttpClient<IApiService,ApiService>(client =>
        {
            client.BaseAddress = new Uri("Your Address Here");
        });
    });
}
public class ApiService : IApiService
{
    Func<IApi> _createClient;

    public ApiService(HttpClient client)
    {
        _createClient = () => 
        {
            return RestService.For<IApi>(client,new RefitSettings
            {
                ContentSerializer = new NewtonsoftJsonContentSerializer()
            });
        }
    }

    public IApi GetApi()
    {
        return new Lazy<IApi>(() => _createClient()).Value;
    }
}

部分也由这篇文章提供:

https://xamgirl.com/consuming-restful-web-service-xamarin-forms-using-refit-part-2/