BaseController для экземпляра HttpClient - PullRequest
1 голос
/ 14 марта 2019

У меня есть клиент API, чтобы сделать запрос. Это описано при запуске.

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

Base

public class BaseController : ControllerBase
{
    public HttpClient client;
    public BaseController(IHttpClientFactory factory, string clientName)
    {
        client = factory.CreateClient(clientName);
    }
    public async Task<IActionResult> Get(string query)
    {
    }
}

Foo

public class FooController : BaseController
{
    public FooController(IHttpClientFactory factory) : base(factory, "fooclient")
    {
    }

    [HttpGet]
    public async Task<IActionResult> Get(int id)
    {
        return await Get($"Foo/Get/{id}");
    }
}

1 Ответ

1 голос
/ 14 марта 2019

В этом подходе нет ничего технически неправильно, но предпочтительнее использовать типизированные клиенты.Это делается путем создания класса «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), для имени клиента не существует волшебных строк, которые вы могли бы жирным пальцем или иным образом испортить.

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