Разрешить службу в действии настройки HttpContext

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

Пример:

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

Вы спрашиваете, как получить доступ к конфигурации в методе ConfigureServices класса Startup? Зачем упоминать действия и HttpContext?

Panagiotis Kanavos 08.11.2018 13:42

Нет, IConfig здесь подразумевается как общая услуга, зарегистрированная у поставщика услуг.

Martin Volek 08.11.2018 13:44

Они зарегистрированы в методе ConfigureServices и не имеют ничего общего с HttpContext или Action.

Panagiotis Kanavos 08.11.2018 13:45

О, я вижу. Под действием я не имею в виду действие контроллера MVC. Я имею в виду параметр метода AddHttpClient. Это действие (анонимный метод), которое настраивает HttpClient.

Martin Volek 08.11.2018 13:52

Для этого есть перегрузка, но вам, вероятно, следует использовать только config DTO вместо службы, которая извлекает настройки при запросе нового HttpClient.

Panagiotis Kanavos 08.11.2018 14:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
658
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

ОБНОВИТЬ В .NET Core 2.1 AddHttpClient не имеет перегрузки с параметрами типа два и aIServiceCollection, несмотря на то, что показано в документации. Та же работа выполняется путем вызова 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, HttpClient>), чтобы передать 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. Использование типизированных клиентов из одноэлементных служб показывает, как использовать 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.

Спасибо. Я искал перегрузку (первая часть вашего ответа), но хотя она есть в документации для .NET Core 2.1, ее нет в коде (github.com/aspnet/HttpClientFactory/blob/release/2.1/src/…) ‌. Он уже находится в ветке выпуска .NET Core 2.2, но сейчас находится в стадии предварительного просмотра. Расширение ConfigureHttpClient находится в .NET Core 2.1, поэтому я могу его использовать.

Martin Volek 08.11.2018 14:38

@MartinVolek имеет перегрузку, которая принимает один параметр типа, но не два

Panagiotis Kanavos 08.11.2018 14:46

Да, теперь я знаю. И перегрузки одного параметра недостаточно для моей цели (поэтому я разместил вопрос).

Martin Volek 08.11.2018 15:01

Другие вопросы по теме