Создайте один HTTP-клиент для API - PullRequest
0 голосов
/ 06 июня 2019

У меня есть несколько классов с именем DataAdapter, расположенных в разных папках, каждый из которых содержит уникально настроенный HttpClient для доступа к внешнему API.Я создаю правильную версию класса DataAdapter, используя Reflection.

Сокращенный пример ниже:

internal class DataAdapter : IDataAdapter
{
    public HttpClient Client => GetClient();

    static HttpClient GetClient()
    {
        // This implementation is unique to the API
        var client = new HttpClient();
        client.AcceptHeader(MediaType.Json);
        client.AuthorizationHeader("123456");
        client.Timeout = TimeSpan.FromSeconds(300);
        return client;

    }
}

Идея заключается в создании одного HttpClient для API.Поэтому, когда второй пользователь приходит и создает новый класс DataAdapter (в той же папке), он должен повторно использовать тот же HttpClient.

Если пользователь создает экземпляр класса new DataAdapter в другой папкенеобходимо создать другую версию HttpClient (если она еще не существует).

В чем я не уверен, так это new HttpClient в методе - будет ли пример возвращать new HttpClient каждый раз, когда создается новый экземпляр этого точного класса или он только когда-либо собираетсясоздать один?

1 Ответ

0 голосов
/ 06 июня 2019

Исходный код будет создавать новый HttpClient каждый раз, когда вы обращаетесь к свойству. Использование следующего кода создаст его в первый раз, когда это необходимо, а затем вернет тот же самый:

internal class DataAdapter : IDataAdapter
{
    public HttpClient Client => staticClient.Value;

    static Lazy<HttpClient> staticClient = new Lazy<HttpClient>(()=>
    {
        // This implementation is unique to the API
        var client = new HttpClient();
        client.AcceptHeader(MediaType.Json);
        client.AuthorizationHeader("123456");
        client.Timeout = TimeSpan.FromSeconds(300);
        return client;    
    });
}

Идея в том, что свойство Lazy<T> дает вам пару вещей. Он задерживает создание экземпляра HttpClient до тех пор, пока он не понадобится; и это обеспечивает безопасность потока без суеты. Использование static Lazy<T> означает, что вы получаете одноэлементный HttpClient на DataAdapter класс, инициализированный как раз вовремя; это звучит так, как будто вы пытаетесь сделать.

Обычно, когда вы запрашиваете client.Value, Lazy<T> создаст HttpClient, используя предоставленный делегат в первый раз, и запомнит это значение во второй раз - и все это, обеспечивая при этом безопасность потоков.

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