HttpClientFactory - получает именованный типизированный клиент по имени - PullRequest
0 голосов
/ 06 сентября 2018

HttpClientFactory предлагает следующий метод расширения:

public static IHttpClientBuilder AddHttpClient<TClient>(this IServiceCollection services, string name)

и я создал типизированный HttpClient следующим образом:

public class CustomClient {

    public CustomClient(HttpClient client,
        CustomAuthorizationInfoObject customAuthorizationInfoObject) {
        /// use custom authorization info to customize http client
    }

    public async Task<CustomModel> DoSomeStuffWithClient() {
        /// do the stuff
    }

}

Я могу зарегистрировать этот пользовательский клиент в ServiceCollection программы следующим образом:

services.AddTransient<CustomAuthorizationInfoObject>();
services.AddHttpClient<CustomClient>("DefaultClient");

Затем я могу зарегистрировать второй экземпляр этого CustomClient с некоторой слегка измененной информацией в нем:

services.AddHttpClient<CustomClient>("AlternativeAuthInfo", (client) => {
    client.DefaultRequestHeaders.Authorization = ...;
});

В другом месте программы я хочу получить имя с именем CustomClient. Это доказывает препятствие.

Я могу получить, какой CustomClient был добавлен к последним службам, просто запросив CustomClient у поставщика услуг.

Вызов, например, IHttpClientFactory.CreateClient("AlternativeAuthInfo"), возвращает HttpClient, поэтому я не могу получить доступ к дополнительному методу в CustomClient, и там, похоже, нет других методов, которые бы мне помогли.

Как мне получить именованный клиент? Или я неправильно использую возможность именовать и ссылаться на типизированного клиента через оригинальный метод расширения?

1 Ответ

0 голосов
/ 06 сентября 2018

Я вижу, что есть ITypedHttpClientFactory<> интерфейс, который может обернуть обычный HttpClient в типизированный. Не использовал это лично, но это недостающий кусок?

, например

/// grab the named httpclient
var altHttpClient = httpClientFactory.CreateClient("AlternativeAuthInfo");

/// get the typed client factory from the service provider
var typedClientFactory = serviceProvider.GetService<ITypedHttpClientFactory<CustomClient>>();

/// create the typed client
var altCustomClient = typedClientFactory.CreateClient(altHttpClient);
...