注入Lazy<IHttpClientFactory>时提示无法解析服务类型报错如何解决
问题产生原因
.NET 自带的 IServiceCollection 依赖注入容器默认不支持自动解析 Lazy<T> 类型的包装服务。你只通过 services.AddHttpClient() 注册了 IHttpClientFactory 本身,容器仅能识别并注入 IHttpClientFactory 实例,不知道如何构造 Lazy<IHttpClientFactory> 对象,因此启动时会抛出服务无法解析的异常。
解决方案
方案1:单独注册Lazy(推荐,改造成本最低)
在Startup.cs的ConfigureServices方法中补充注册对应Lazy服务即可,原有控制器的注入逻辑无需任何修改即可正常运行,代码如下:
public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(); // 补充注册Lazy<IHttpClientFactory> services.AddTransient<Lazy<IHttpClientFactory>>(sp => new Lazy<IHttpClientFactory>(sp.GetRequiredService<IHttpClientFactory>) ); // 其他服务注册逻辑 }
方案2:全局支持Lazy自动解析
如果项目中大量使用Lazy<T>做懒加载,可以批量封装服务注册逻辑,实现所有已注册服务的Lazy<T>自动解析,无需逐个注册;也可以切换支持Lazy<T>自动解析的第三方DI容器(例如Autofac),接入后无需额外注册即可直接在构造函数注入任意Lazy<T>类型的服务。
方案3:通过服务定位器手动获取(不推荐)
如果不想修改服务注册逻辑,可以直接注入IServiceProvider,在用到IHttpClientFactory的时候手动拉取实例:
private readonly IServiceProvider _serviceProvider; protected IHttpClientFactory ClientFactory => _serviceProvider.GetRequiredService<IHttpClientFactory>(); public ValuesController(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; }
注意:该方案属于服务定位器模式,会破坏依赖注入的显式依赖规则,不推荐在常规业务场景使用。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

