尝试激活服务时无法解析类型“System.Lazy`1[System.Net.Http.IHttpClientFactory]”的服务

Posted

技术标签:

【中文标题】尝试激活服务时无法解析类型“System.Lazy`1[System.Net.Http.IHttpClientFactory]”的服务【英文标题】:Unable to resolve service for type 'System.Lazy`1[System.Net.Http.IHttpClientFactory]' while attempting to activate service 【发布时间】:2021-12-16 07:23:09 【问题描述】:

我在尝试注入 Lazy 时遇到以下错误。

没有“懒惰”也能正常工作

我已经在 startup.cs 中像下面这样注册了它。

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

        ..
   

我正在尝试将其注入如下控制器:

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

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

在这里,我收到一个错误:

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

任何想法,延迟初始化可能是什么问题?

【问题讨论】:

你为什么使用Lazy&lt;&gt;?你期望它做什么? HttpClientFactory 本身就是用于创建其他类型实例的类型。它本质上是一个由 DI 容器本身管理的单例,所以 Lazy&lt;IHttpClientFactory&gt; 不会有任何影响 内置的依赖注册不会在 Lazy&lt;T&gt; 中包装值 - 你要么必须自己做(这增加了一点好处并增加了复杂性),要么只是不使用 Lazy&lt;T&gt; 和自行解决服务。 @MartinCostello:我过去曾这样做过(可能使用旧版本的 microsoft.extensions.http)。是不是因为 microsoft.extensions.http 的更新版本?由于大量依赖,我无法在当前项目中降级以验证这一点。 【参考方案1】:

只是不要使用Lazy&lt;IHttpClientFactory&gt;。 HttpClientFactory 本身就是创建和缓存 HttpClients 实例的类型,或者更确切地说,是 HttpClientHandlers。

它是由 DI 容器本身管理的 a singleton,所以 Lazy&lt;IHttpClientFactory&gt; 不会有任何影响,即使你让它编译。

AddHttpClient 的源代码将默认的 HttpClientFactory 显式注册为单例。

    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>();

【讨论】:

知道了,谢谢。我心中唯一的疑问是 - 我过去曾这样做过(可能使用旧版本的 microsoft.extensions.http)。是不是因为 microsoft.extensions.http 的更新版本?由于大量依赖,我无法在当前项目中降级以验证这一点 这与Microsoft.Extensions.Http无关。 Lazy 从来不需要。或许你在过去注册了一个返回 Lazy&lt;&gt; 的工厂方法,但实际的 HttpClientFactory 始终是单例。

以上是关于尝试激活服务时无法解析类型“System.Lazy`1[System.Net.Http.IHttpClientFactory]”的服务的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“尝试激活''时无法解析类型''的服务”

.net Core 6 - 尝试激活时无法解析服务类型

InvalidOperationException:尝试激活“DocumentController”时无法解析“IDocumentService”类型的服务

尝试激活“AspNetCoreRateLimit.IpRateLimitMiddleware”时无法解析“AspNetCoreRateLimit.IProcessingStrategy”类型的服务

尝试激活“MyService”时无法解析“System.String”类型的服务

尝试激活“AuthenticateController”时无法解析“Microsoft.AspNetCore.Identity.UserManager”类型的服务