将 IHttpClientFactory 传递给 .NET Standard class 库

Passing IHttpClientFactory to .NET Standard class library

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

我正在尝试在我的 ASP.NET Core 2.1 Preview-2 应用程序中使用此功能,但我需要在我的 class 库中使用 HttpClient,这些库位于 .NET 中标准 2.0

一旦我在 Startup.cs 中执行 ConfigureServices() 中的 AddHttpClient,我如何将此 HttpClientFactory 或特定命名的 HttpClient 传递给 API 我在 .NET Standard 2.0 class 库中创建的客户端?该客户端几乎可以处理我向第三方发出的所有 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");
    });
}

首先,您的库 class' 构造函数应该采用 HttpClient 参数,因此您可以将 HttpClient 注入其中。然后,最简单的方法(在 link 文章中提到以及它的价值)是简单地为该库添加一个特定的 HttpClient class:

services.AddHttpClient<MyLibraryClass>(...);

然后,当然,注册您的库 class 以进行注入,如果您还没有:

services.AddScoped<MyLibraryClass>();

然后,当您的库 class 被实例化以注入到某些东西中时,它也会注入您为其指定的 HttpClient

或者,您可以手动指定一个 HttpClient 实例以通过以下方式注入:

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

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