Я нашел этого актера:
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 и т. д.
Исходный код для AddHttpClient: github.com/dotnet/runtime/blob/main/src/libraries/…
Возможно, вы захотите проверить Делайте HTTP-запросы с помощью IHttpClientFactory в ASP.NET Core, где объясняется, как настроить «именованные» и типизированные HttpClient, что также включает в себя возможность конфигуративно настраивать такие вещи, как базовые адреса, заголовки по умолчанию и т. д.





Когда вы используете 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);
}
Если вас интересует управление их жизненным циклом, пожалуйста, ознакомьтесь с этой ТАК темой.
«Я не могу найти код, который устанавливает BaseAddress и т. д.» Почему фреймворк должен его устанавливать? Для настройки клиентов требуется передать делегат конфигурации
AddHttpClient.