Исходный код будет создавать новый 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
, используя предоставленный делегат в первый раз, и запомнит это значение во второй раз - и все это, обеспечивая при этом безопасность потоков.