如何在不使用UseStartup()的IWebHost构建器AddHttpClient中注入IOption<T>
IOptions注入依赖HttpClient的类失败的排查与解决
尝试将IOptions<MyOption>注入到依赖HttpClient和IOptions的MyHttpService类中,但发现IOptions并未成功注入。相关代码如下:
服务类与配置类代码
public class MyHttpService : IMyHttpService { private readonly HttpClient _httpClient; private readonly IOptions<MyOption> _myOption; // 构造函数无public修饰符 MyHttpService(HttpClient httpClient, IOptions<MyOption> myOption) { _httpClient = httpClient; _myOption = myOption; } //更多方法... } public class MyOption { public string MyStringSetting {get;set;} //更多配置项... }
appsettings.json配置
{ "MyOptions":{ "MyStringSetting": "SomeSetting" } }
Program.cs配置代码
IWebHostBuilder builder = WebHost.CreateDefaultBuilder(args) .Configure() .ConfigureLogging() .UseNLog() .ConfigureServices((context, services) => { services.AddOptions(); IConfiguration configuration = context.Configuration; services.Configure<MyOption>(configuration.GetSection("MyOptions")); services.AddHttpClient<IMyHttpService,MyHttpService>((provider,client) => { client.BaseAddress = new Uri(*api url*); }); }) IWebHost webHost = builder.build(); webHost.Run();
问题原因与解决步骤
核心问题:构造函数访问修饰符缺失
MyHttpService的构造函数未添加public修饰符,依赖注入容器无法访问并实例化该类,导致包括IOptions<MyOption>在内的所有依赖都无法正常注入。
修复步骤
修改构造函数为public:
public MyHttpService(HttpClient httpClient, IOptions<MyOption> myOption) { _httpClient = httpClient; _myOption = myOption; }验证其他配置正确性:
- 已正确调用
services.AddOptions(),启用Options服务; - 配置节绑定逻辑正确:
services.Configure<MyOption>(configuration.GetSection("MyOptions"))与appsettings中的"MyOptions"节匹配,无需调整; AddHttpClient用法合规,HttpClientFactory会自动解析构造函数中已注册到DI容器的其他依赖。
- 已正确调用
修复后,DI容器即可正常创建MyHttpService实例,并完成HttpClient和IOptions<MyOption>的注入。
内容的提问来源于stack exchange,提问作者Aditya Gupta
相关产品推荐
相关产品推荐

