将IHttpClientFactory传递到.NET Standard类库

Sam*_*Sam 4 asp.net-core .net-standard-2.0 httpclientfactory

IHttpClientFactory新的ASP.NET Core 2.1中有一个非常酷的功能, https://www.hanselman.com/blog/HttpClientFactoryForTypedHttpClientInstancesInASPNETCore21.aspx

我正在尝试在ASP.NET Core 2.1 Preview-2应用程序中使用此功能,但是我需要HttpClient在.NET Standard 2.0中的类库中使用。

有一次,我执行AddHttpClientConfigureServices()Startup.cs,我怎么通过这个HttpClientFactory或命名具体HttpClient到我在.NET 2.0标准类库创建的API客户端?该客户端几乎可以处理我对第三方的所有API调用。

基本上,我只是想将特定的名称添加HttpClient到我的中thirdPartyApiClient

这是我的代码ConfigureServices()

public void ConfigureServices(IServiceCollection services)
{
    // Create HttpClient's
    services.AddHttpClient("Api123Client", client =>
    {
         client.BaseAddress = new Uri("https://api123.com/");
         client.DefaultRequestHeaders.Add("Accept", "application/json");
    });
    services.AddHttpClient("Api4567Client", client =>
    {
         client.BaseAddress = new Uri("https://api4567.com/");
         client.DefaultRequestHeaders.Add("Accept", "application/json");
    });
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*elZ 27

现在有一个 NuGet 包Microsoft.Extensions.Http提供 IHttpClientFactory 到 .NET Standard 2.0


Chr*_*att 9

首先,您的库类的构造函数应带有一个HttpClient参数,以便您可以HttpClient向其中注入一个。然后,最简单的方法(在链接文章中也提到了它的价值)是HttpClient为该库类添加一个特定的:

services.AddHttpClient<MyLibraryClass>(...);
Run Code Online (Sandbox Code Playgroud)

然后,当然,如果尚未注册,请注册您的库类以进行注入:

services.AddScoped<MyLibraryClass>();
Run Code Online (Sandbox Code Playgroud)

然后,当实例化您的库类以将其注入到某物时,它也将随HttpClient您为其指定的注入。

或者,您可以HttpClient通过以下方式手动指定要插入的实例:

services.AddScoped(p => {
    var httpClientFactory = p.GetRequiredService<IHttpClientFactory>();
    return new MyLibraryClass(httpClientFactory.Create("Foo"));
});
Run Code Online (Sandbox Code Playgroud)

  • 更新:在这种情况下,`AddHttpClient` 已经为您处理服务注册。如果按照上述方法进行操作,可能会出现错误。参考:https://github.com/dotnet/extensions/issues/1079 (2认同)