В этом подходе нет ничего технически неправильно, но предпочтительнее использовать типизированные клиенты.Это делается путем создания класса «service», который будет владеть клиентом:
public class FooService
{
private readonly HttpClient _httpClient;
public FooService(HttpClient httpClient)
{
_httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
}
...
}
Затем вы регистрируете это в ConfigureServices
:
services.AddHttpClient<FooService>(c =>
{
// configure your HttpClient
});
Наконец, вывведите этот класс обслуживания в ваш контроллер:
public class FooController : ControllerBase
{
private readonly FooService _fooService;
public FooController(FooService fooService)
{
_fooService = fooService ?? throw new ArgumentNullException(nameof(fooService));
}
...
}
Затем он служит для инкапсуляции вашей логики HttpClient
.Вы просто добавляете методы в службу для выполнения действий, которые необходимы контроллеру, и служба выполняет фактические HttpClient
запросы для этого.Это значительно облегчает изменение вещей, если используемый вами API должен измениться.Вы просто меняете сервис, и все готово, вместо того, чтобы отслеживать каждое место, которое вы использовали HttpClient
для взаимодействия с этим API, что является гораздо более сложной задачей.
Кроме того, наличиенабираемый клиент дает вам возможность настроить его раз и навсегда, а также добавлять такие вещи, как политики повторных попыток и обработки исключений в одном месте.Поскольку клиент вводится для определенного типа (например, FooService
), для имени клиента не существует волшебных строк, которые вы могли бы жирным пальцем или иным образом испортить.