如何在Startup类中正确使用强类型配置?已触发空引用异常
解决Startup类中使用强类型配置的问题
问题原因
你在Startup类构造函数中尝试注入IOptions<Config>会报错,是因为Startup的构造函数执行时机早于ConfigureServices方法——主机先实例化Startup,再调用ConfigureServices注册服务。这时候构造函数里要的IOptions<Config>还没被注册到服务容器,自然会抛出空引用异常。
两种可行解决方案
方案1:直接从Configuration绑定实例
既然Startup里已经持有IConfiguration对象,直接把配置绑定到Config实例即可,不需要依赖注入:
public class Startup { public IConfiguration Configuration { get; } public Config AppConfig { get; } // 新增强类型配置实例 public Startup(IHostEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build(); // 直接绑定配置到Config实例 AppConfig = Configuration.Get<Config>(); } public void ConfigureServices(IServiceCollection services) { services.AddCors(); services.AddMvc(option => option.EnableEndpointRouting = false); services.Configure<Config>(Configuration); // 依然保留这行,供其他类注入使用 } // 在Startup的其他方法(比如Configure)中直接使用 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 使用AppConfig Console.WriteLine(AppConfig.SomeSetting); } }
方案2:在Configure方法中注入IOptions
Configure方法支持依赖注入,此时ConfigureServices已经执行完毕,服务容器已注册IOptions<Config>,可以直接注入使用:
public class Startup { public IConfiguration Configuration { get; } public Startup(IHostEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public void ConfigureServices(IServiceCollection services) { services.AddCors(); services.AddMvc(option => option.EnableEndpointRouting = false); services.Configure<Config>(Configuration); // 注册配置服务 } // 在Configure方法中注入IOptions<Config> public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions<Config> config) { var appConfig = config.Value; // 在这里使用appConfig Console.WriteLine(appConfig.SomeSetting); } }
注意事项
- 不要在Startup的构造函数中注入
IOptions<Config>,此时服务尚未注册,必然报错。 - 如果你需要在
ConfigureServices方法中使用强类型配置,直接用方案1的绑定方式即可,因为ConfigureServices执行时,Startup的AppConfig已经初始化完成。
内容的提问来源于stack exchange,提问作者JBoothUA
相关产品推荐
相关产品推荐

