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

AddSingleton注册配置后手动new FirewallPorts实例属性为空如何解决

问题原因
  • 手动调用new FirewallPorts()仅会触发类的无参构造函数完成基础实例化,不会自动执行配置绑定逻辑。你通过DI注入拿到的实例之所以有值,是因为Configuration.GetSection("FirewallPorts").Get<FirewallPorts>()这一步已经由.NET配置框架完成了属性映射:自动读取appsettings.json中对应节点的配置值,按属性名匹配赋值给实例,手动new不会触发这个流程,因此所有属性都是默认值null。
  • 补充说明你对AddSingleton的理解存在小偏差:你当前使用的AddSingleton<T>(实例)重载是在服务注册阶段就完成实例创建,并非首次调用时才生成;只有使用AddSingleton<T>(实现类)、AddSingleton<T>(工厂委托)这类重载时,才会在服务首次被解析时创建实例。
修复方案

你可以根据使用场景选择以下任意一种方案:

  • 方案1:优先从DI容器获取已绑定好配置的单例实例
    只要你能拿到当前应用的IServiceProvider对象,直接解析服务即可:
    var fp = serviceProvider.GetRequiredService<IFirewallPorts>();
    SomeClass sc = new SomeClass(fp);
    
  • 方案2:手动执行配置绑定逻辑
    如果你能拿到IConfiguration实例,手动给新创建的实例绑定配置即可:
    FirewallPorts fp = new FirewallPorts();
    // 手动把配置节点的值绑定到实例属性
    Configuration.GetSection("FirewallPorts").Bind(fp);
    // 也可以直接用Get方法生成绑定好的实例
    // FirewallPorts fp = Configuration.GetSection("FirewallPorts").Get<FirewallPorts>();
    SomeClass sc = new SomeClass(fp);
    
  • 方案3:手动赋值属性(不推荐)
    无配置对象可用时直接硬编码给实例属性赋值,仅适合临时测试使用。

内容的提问来源于stack exchange,提问作者SkyeBoniwell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:18:01