Home > Net >  Unable to resolve service for type 'System.Lazy`1[System.Net.Http.IHttpClientFactory]' whi
Unable to resolve service for type 'System.Lazy`1[System.Net.Http.IHttpClientFactory]' whi

Time:11-01

I am getting the below error while trying to inject Lazy.

It works fine without "Lazy<>"

I have registered it like below in startup.cs.

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient();
        ..

        ..
   }

I am trying to inject it in a controller like below:

 private readonly Lazy<IHttpClientFactory> _clientFactory;
    protected IHttpClientFactory ClientFactory => _clientFactory.Value;

    public ValuesController(Lazy<IHttpClientFactory> clientFactory)
    {
         _clientFactory = clientFactory;
    }

Here, I am getting an error:

System.InvalidOperationException: 'Unable to resolve service for type 'System.Lazy`1[System.Net.Http.IHttpClientFactory]' while attempting to activate 'POC.Core.Controllers.ValuesController'.'

Any idea, what could be the issue in lazy initialization?

CodePudding user response:

Just don't use Lazy<IHttpClientFactory>. HttpClientFactory itself is the type that creates and caches instances of HttpClients, or rather, HttpClientHandlers.

It's a singletonmanaged by the DI container itself so Lazy<IHttpClientFactory> wouldn't have any effect, even if you got it to compile.

The source code of AddHttpClient explicitly registers a default HttpClientFactory as a singleton.

    public static IServiceCollection AddHttpClient(this IServiceCollection services)
    {
        if (services == null)
        {
            throw new ArgumentNullException(nameof(services));
        }

        services.AddLogging();
        services.AddOptions();

        //
        // Core abstractions
        //
        services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
        services.TryAddSingleton<DefaultHttpClientFactory>();
  • Related