IHttpClientFactory в .NET Framework 4.7.2 без внедрения зависимостей

Я планирую использовать пакет Microsoft.Extensions.Http в моем проекте ASP.NET Framework 4.7.2 Webforms. Поскольку в .NET Framework нет встроенного контейнера внедрения зависимостей, я не использую пакеты внедрения зависимостей. Основываясь на этом ответе, я не уверен в последней строке -

Microsoft.Extensions.Http предоставляет только HttpClientFactory, а не новый оптимизированный HttpClient. Это доступно только в .NET Core 2.1.

Могу ли я реализовать IHttpClientFactory без DI и с использованием одноэлементного метода в моем проекте Framework и избавиться от двух проблем прямого использования HttpClient — исчерпания сокетов и разрешения DNS? Есть ли что-то еще, что нужно сделать на основе приведенного выше комментария?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, использование HttpClientFactory тесно интегрировано с инфраструктурой DI. К счастью, создать новый IHttpClientFactory без использования полной инфраструктуры DI можно в несколько строк:

IHttpClientFactory factory = new ServiceCollection()
    .AddHttpClient()
    .BuildServiceProvider()
    .GetRequiredService<IHttpClientFactory>();

С помощью приведенного выше кода вы создаете нового нового поставщика услуг (который является контейнером MS.DI), который просто содержит регистрации для клиентского пакета HTTP, который включает регистрацию для IHttpClientFactory, а IHttpClientFactory извлекается непосредственно из контейнера. Фабрика хранится в переменной, а сам контейнер больше не используется.

Полноценное рабочее консольное приложение должно выглядеть так:

// This requires the 'Microsoft.Extensions.Http` package to be installed
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Threading.Tasks;

internal class Program
{
    static async Task Main(string[] args)
    {
        IHttpClientFactory factory = new ServiceCollection()
            .AddHttpClient()
            .BuildServiceProvider()
            .GetRequiredService<IHttpClientFactory>();

        HttpClient client = factory.CreateClient();

        string html = await client.GetStringAsync("https://blogs.cuttingedge.it/steven/");

        Console.WriteLine(html);

        Console.ReadLine();
    }
}

Лучше всего кешировать IHttpClientFactory на время жизни вашего приложения, а не воссоздавать его на лету.

Привет @Steven, я реализовал IHttpClientFactory, очень похожий на то, что вы написали, на самом деле вдохновленный этим Я просто хотел убедиться, что эта реализация полностью проверена и не вызовет проблем. Потому что этот комментарий, который Панайотис дал здесь, меня смутил. «Microsoft.Extensions.Http предоставляет только HttpClientFactory, а не новый оптимизированный HttpClient. Он доступен только в .NET Core 2.1». Итак, мы должны хорошо использовать предложенный вами подход, верно?

Jatin 10.01.2023 07:43

Привет @Steven, разве нам не нужно избавляться от IServiceProvider? Или создать прицел на нем? И можно ли использовать тот же подход для создания ILogger в приложении WebForms 4.7?

Jatin 20.01.2023 18:00

Я бы сказал, что для этого конкретного варианта использования нет необходимости создавать область действия (поскольку IHttpClientFactory регистрируется как синглтон) и нет необходимости удалять IServiceProvider при закрытии приложения (поскольку единственное, чем оно управляет, — это IHttpClientyFactory) . Попытка избавиться от поставщика услуг или управлять областью действия только усложняет решение, но не дает дополнительных преимуществ.

Steven 23.01.2023 21:21

Еще 2 вопроса: 1) Если мы хотим использовать ILogger в веб-приложении .NET Framework, можем ли мы сделать то, что я написал здесь, то есть вопрос, который я задал здесь. Кстати, если бы вы могли помочь мне с этим вопросом, было бы очень полезно :) 2) Мы также хотим зарегистрировать несколько пользовательских классов. Как в таком случае передать IServiceProvider (для создания областей) различным классам потребителей с помощью MS DI в Framework? Нам нужна только инъекция конструктора. @Стивен

Jatin 26.01.2023 15:46

Другие вопросы по теме