Как HttpClient внедряется в актер?

Я нашел этого актера:

public class MobileOtpService : IMobileOptService
{
    private readonly HttpClient _client;

    public MobileOtpService(HttpClient client) // How is this injected?
    {
        _client = client;
    }
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMobileOptService, MobileOtpService>();
        ...
        services.AddHttpClient();
    }
}

Я не могу найти жестко запрограммированные экземпляры MobileOtpService, поэтому, должно быть, просто используется DI.

Как вводится HttpClient?

Это происходит автоматически из-за services.AddHttpClient()?

Я не могу найти код, который устанавливает BaseAddress и т. д.

«Я не могу найти код, который устанавливает BaseAddress и т. д.» Почему фреймворк должен его устанавливать? Для настройки клиентов требуется передать делегат конфигурации AddHttpClient.

shingo 26.04.2024 06:57

Исходный код для AddHttpClient: github.com/dotnet/runtime/blob/main/src/libraries/…

flackoverstow 26.04.2024 07:16

Возможно, вы захотите проверить Делайте HTTP-запросы с помощью IHttpClientFactory в ASP.NET Core, где объясняется, как настроить «именованные» и типизированные HttpClient, что также включает в себя возможность конфигуративно настраивать такие вещи, как базовые адреса, заголовки по умолчанию и т. д.

marc_s 26.04.2024 07:43
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы используете services.AddHttpClient(); в методе расширения, вы увидите, что они добавляют стандартный HttpClient вот так:

 // Register default client as HttpClient
            services.TryAddTransient(s =>
            {
                return s.GetRequiredService<IHttpClientFactory>().CreateClient(string.Empty);
            });

Для регистрации MobileOtpService я бы предложил использовать метод расширения AddHttpClient следующим образом:

services.AddHttpClient<IMobileOtpService,MobileOtpService>(httpClient => 
{
  httpclient.BaseAddress = "localhost"
  // add other httpclient config here
});
Ответ принят как подходящий

Существует множество способов регистрации и использования HttpClients. Перечислю здесь варианты:

Клиент по умолчанию

Эту опцию можно использовать для получения HttpClient с настройками по умолчанию.

Постановка на учет

services.AddHttpClient();

Применение

private readonly HttpClient uniqueClient;
public XYZService(IHttpClientFactory clientFactory)
  => uniqueClient = clientFactory.CreateClient();

Именованный клиент

Эту опцию можно использовать для получения пресета HttpClient.

Постановка на учет

services.AddHttpClient("UniqueName", client => client.BaseAdress = ...);

Применение

private readonly HttpClient uniqueClient;
public XYZService(IHttpClientFactory clientFactory)
  => uniqueClient = clientFactory.CreateClient("UniqueName");

Типизированный клиент

Эту опцию можно использовать для переноса значения по умолчанию/предустановки HttpClient в абстракцию более высокого уровня.

Постановка на учет

services.AddHttpClient<UniqueClient>();
services.AddHttpClient<IUniqueClient, UniqueClient>(client => client.BaseAdress = ...);

Применение

private readonly HttpClient httpClient;
public UniqueClient(HttpClient client)
  => httpClient = client;
private readonly IUniqueClient uniqueClient;
public XYZService(IUniqueClient client)
  => uniqueClient = client;

Именованный и типизированный клиент

Эту опцию можно использовать для регистрации различных предустановок HttpClient и переноса их в абстракцию более высокого уровня.

Постановка на учет

services.AddHttpClient<IUniqueClient, UniqueClient>("primary", client => client.BaseAdress = ...);
services.AddHttpClient<IUniqueClient, UniqueClient>("secondary", client => client.BaseAdress = ...);

Применение

private readonly HttpClient httpClient;
public UniqueClient(HttpClient client)
  => httpClient = client;
public XYZService(
   IHttpClientFactory namedClientFactory, 
   ITypedHttpClientFactory<UniqueClient> namedTypedClientFactory)
{
    var namedClient = namedClientFactory.CreateClient("primary");
    var namedTypedClient = namedTypedClientFactory.CreateClient(namedClient);
}

Если вас интересует управление их жизненным циклом, пожалуйста, ознакомьтесь с этой ТАК темой.

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