如何在.NET托管Worker Service的Program类中注入IConfiguration?
解决Worker Service中获取IConfiguration的问题
这个CS0120错误的原因很清晰:你在静态的CreateHostBuilder方法里尝试访问Program类的非静态Configuration字段,静态方法无法直接访问类的实例成员,所以才会报错。而且其实你完全不需要在Program类里通过构造函数注入IConfiguration——因为Host.CreateDefaultBuilder已经帮你自动加载了所有配置文件(包括appsettings.json),直接用现成的配置即可。
最简单的修复方案
直接使用ConfigureServices委托里的hostContext参数,它的Configuration属性就是已经加载好的完整配置:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); services.AddScoped(factory => { // 直接从hostContext获取配置 var connectionString = hostContext.Configuration.GetConnectionString("DefaultConnection"); return new QueryFactory { Compiler = new SqlServerCompiler(), Connection = new SqlConnection(connectionString), }; }); }); }
关键修改点:
- 删除了
Program类里的私有Configuration字段和构造函数——这些完全用不上,反而引发错误 - 用
hostContext.Configuration替代原来的Configuration,hostContext是ConfigureServices委托自带的参数,包含了当前主机的所有配置信息
另一种方案:从服务容器获取IConfiguration
如果你习惯从依赖注入容器中获取服务,也可以通过factory参数(本质是IServiceProvider)直接获取IConfiguration:
services.AddScoped(factory => { var config = factory.GetRequiredService<IConfiguration>(); var connectionString = config.GetConnectionString("DefaultConnection"); return new QueryFactory { Compiler = new SqlServerCompiler(), Connection = new SqlConnection(connectionString), }; });
这种方式和第一种效果完全一致,适合需要同时获取其他服务的场景。
最后确认配置文件
别忘了确保你的appsettings.json里存在对应的连接字符串配置:
{ "ConnectionStrings": { "DefaultConnection": "Server=你的服务器地址;Database=你的数据库名;Trusted_Connection=True;TrustServerCertificate=True;" } }
内容的提问来源于stack exchange,提问作者ariefs
相关产品推荐
相关产品推荐

