You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:15:13