Здесь есть несколько вещей, на которые стоит обратить внимание, первое из которых MyStaticObject
действительно должно быть указано c? Если это произойдет, я бы рекомендовал вместо этого зарегистрировать его как Singleton, чтобы вы могли по-прежнему использовать внедрение зависимостей. Сделав это, вы можете зарегистрировать IHttpClientFactory
и использовать его из своего кода. Ваш ConfigureServices
метод может в конечном итоге выглядеть примерно так
public void ConfigureServices(IServiceCollection services)
{
//The base extension method registers IHttpClientFactory
services.AddHttpClient();
services.AddSingleton<IMySingletonObject, MySingletonObject>();
}
Тогда в вашем классе потребления, MySingletonObject
в этом случае, вы настроите его так:
public class MySingletonObject
{
private readonly IHttpClientFactory _clientFactory;
public MySingletonObject(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task SomeMethodThatUsesTheClient()
{
var client = _clientFactory.CreateClient();
//use the client
}
}
. Причина этого заключается в том, что IHttpClientFactory
обрабатывает проблемы времени жизни и пула для нас. По документам :
Управляет пулами и временем жизни базовых экземпляров HttpClientMessageHandler. Автоматическое управление c позволяет избежать распространенных проблем DNS (Domain Name System), возникающих при ручном управлении временем жизни HttpClient.
Это происходит при выполнении вызова CreateClient
, поэтому вы хотите сделать это внутри код с использованием клиента, в отличие от запуска вашего приложения.
В качестве примечания: если вам вообще не нужен этот класс в качестве одиночного, вы можете использовать расширение services.AddHttpClient<IMyClass, MyClass>()
и внедрить HttpClient
прямо в класс. Контейнер DI будет обрабатывать получение клиента с завода за кулисами.