Как передать / ввести более одного параметра HttpClient в типизированный HttpClientClass? - PullRequest
0 голосов
/ 25 марта 2019

Я хочу зарегистрировать набранный HttpClient как здесь Документы Microsoft .По сути, подход должен быть

services.AddHttpClient ();

обычно шаблон этих классов получает только класс HttpClient в качестве параметра, и вы реализуете логику для вызова конечной точки.В моем случае мне нужно использовать 2 HttpClient внутри моего MyHttpClient, один для проверки связи с конечной точкой, а другой для связи с IdentityProvider для обнаружения refreshEndpoints для обновления моих файлов cookie.

public class MyHttpClient : IMyHttpClient
{
    public MyHttpClient (HttpClient httpClient, 
                         HttpClient refreshHttpClient)
    {
    }
}

Если я пытаюсьчтобы разрешить из контроллера IMyHttpClient, я получаю сообщение о том, что он не может разрешить HttpClient.

В коде GitHub в строке 43 AddHttpClient вы можете видеть, что он вызывает DefaultTypedHttpClientFactory.Если вы перейдете к реализации DefaultTypedHttpClientFactory , вы заметите, что это универсальный тип.И когда он вызывает CreateClient, он передает только один параметр конструктору в строке 39.

Единственный обходной путь, который я вижу здесь, это не создавать типизированный клиент и зарегистрировать обычный класс, который получает IHttpClientFactory, а также создавать и настраиватьмои клиенты на лету, а не как напечатано.Любая другая идея?

1 Ответ

1 голос
/ 25 марта 2019

Вы не можете. Вам нужно будет либо внедрить другой слой сервиса, либо IHttpClientFactory напрямую

Другая услуга

public class MyRefreshClient
{
    private readonly HttpClient _httpClient;

    public MyRefreshClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    ...
}

public class MyHttpClient : IMyHttpClient
{
    private readonly HttpClient _httpClient;
    private readonly MyRefreshClient _refreshClient;

    public MyHttpClient(HttpClient httpClient, MyRefreshClient refreshClient)
    {
        _httpClient = httpClient;
        _refreshClient = refreshClient;
    }
}

Тогда:

services.AddHttpClient<MyRefreshClient>(c => { ... });
services.AddHttpClient<MyHttpClient>(c => { ... });

Inject IHttpClientFactory (и использовать именованные клиенты) :

public class MyHttpClient : IMyHttpClient
{
    private readonly HttpClient _httpClient;
    private readonly HttpClient _refreshClient;

    public MyHttpClient(IHttpClientFactory httpClientFactory)
    {
        _httpClient = httpClientFactory.CreateClient("MyHttpClient");
        _refreshClient = httpClientFactory.CreateClient("MyRefreshClient");
    }
}

Тогда:

services.AddHttpClient("MyHttpClient", c => { ... });
services.AddHttpClient("MyRefreshClient", c=> { ... });
...