dotnet-httpclient.net-4.7.2ihttpclientfactory

Why doesn't System.Net.Http.HttpClientFactory implement System.Net.Http.IHttpClientFactory?


I'm using .NET Framework 4.7.2 and am trying to use IHttpClientFactory to create HttpClient instances.

I downloaded the Microsoft.Extensions.Http v7 NuGet Package and now have access to System.Net.Http.HttpClientFactory.

Am I meant to use HttpClientFactory.Create() to create HttpClients?

Or do I have to use DI and IHttpClientFactory?

What is HttpClientFactory used for and why doesn't it implement IHttpClientFactory?


Solution

  • I've checked the source code of the DefaultHttpClientFactory and even though it is part of the Microsoft.Extensions.Http namespace it is marked as internal.

    Gladly the AddHttpClient extension method can do the DI registration of the above class on our behalf.

    services.TryAddSingleton<DefaultHttpClientFactory>();
    services.TryAddSingleton<IHttpClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());
    

    So, all you need to do is:

    1. create a ServiceCollection
    2. call the AddHttpClient
    3. build it to have a ServiceProvider
    4. call the GetRequiredService

    In order to do that in .NET Framework 4.7.2 you need to use the Microsoft.Extensions.DependencyInjection package.

    using System;
    using System.Net.Http;
    using Microsoft.Extensions.DependencyInjection;
    
    class Program
    {
        private static readonly ServiceProvider serviceProvider;
    
        static Program()
        {
            serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
        }
    
        public static void Main(string[] args)
        {
            var factory = serviceProvider.GetRequiredService<IHttpClientFactory>();
            Console.WriteLine(factory == null); //False
        }
    }
    

    Here I have detailed how to do the same with SimpleInjector