Разрешить службу в HttpContext настроить Действие - PullRequest
0 голосов
/ 08 ноября 2018

В ядре asp.net я регистрируюсь, набираю HttpClient и мне нужна услуга разрешения от поставщика услуг. Как я могу разрешить услуги там?

Пример:

services
    .AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>(httpClient =>
    {
        // how to resolve service on next line?
        var config = RESOLVE_SERVICE<IConfig>();
        httpClient.BaseAddress = config.GetBaseUrl();
    });

1 Ответ

0 голосов
/ 08 ноября 2018

Я предполагаю, что реальный вопрос заключается в том, как получить доступ к конфигурации или любой другой службе при регистрации типизированных HttpClient и HttpContext (контекст конкретного HTTP-запроса) не имеет значения.

ОБНОВЛЕНИЕ В .NET Core 2.1 AddHttpClient не имеет перегрузки с параметрами типа два и IServiceCollection, несмотря на то, что показано в документации. То же самое задание выполняется с помощью вызова ConfigureHttpClient после AddHttpClient.

services
    .AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>()
    .ConfigureHttpClient(svc,httpClient =>
    {
        // how to resolve service on next line?
        var config = svc.GetRequiredService<IConfig>();
        httpClient.BaseAddress = config.GetBaseUrl();
    });

Оригинал

Вы можете использовать перегрузку AddHttpClient (IServiceCollection, String, Action ) для передачи IServiceProvider действию, которое можно использовать для разрешения других служб:

services
    .AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>((svc,httpClient =>
    {
        // how to resolve service on next line?
        var config = svc.GetRequiredService<IConfig>();
        httpClient.BaseAddress = config.GetBaseUrl();
    });

Я бы предложил прочитать серию статей Стива Гордона о типизированных HttpClients и HttpClientFactory. Использование типизированных клиентов из Singleton Services показывает, как использовать AddHttpClient для настройки клиента. Остальные его статьи показывают, как настроить его с помощью HttpClientFactory и Polly для правильного объединения и повторных попыток

Конфигурация

Пример Стива Гордона использует IOption для чтения данных из инфраструктуры конфигурации.

services.AddHttpClient<IConfigurationService, ConfigurationService>()
.ConfigureHttpClient((serviceProvider, client) =>
{
    var baseAddress = serviceProvider.GetRequiredService<IOptions<SdkOptions>>().Value.BaseAddress;
    client.BaseAddress = new Uri(baseAddress);
});

Это хорошая идея - регистрация HttpClient не должна знать и не должна зависеть от источника его значений конфигурации. IConfig должен быть не чем иным, как DTO конфигурации, загруженным на этапе конфигурации.

. Конфигурация .NET Core может загружать значения из файлов json / xml / ini, баз данных, внешних служб, переменных среды, всего, что может возвращать значения в форме "section:subsection" - value. Он также позволяет комбинировать и перегружать настройки, которые могут быть очень полезными.

У меня есть приложения, которые загружают настройки из файлов (базовая конфигурация), базы данных, управляемые другими командами (внешние конечные точки службы и учетные данные) и командную строку (возможные переопределения). Конфигурации конечной точки используются для создания N с именем HttpClients, по одному на конечную точку. Я использовал этот пример для создания поставщика EF Core, который загружает настройки конечной точки.

Это позволяет проверить настройки при запуске приложения, что может быть значительным преимуществом. Без него приложение не узнает, что что-то не так, пока в первый раз не будет запрошен конкретный HttpClient.

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