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
相关产品推荐
相关产品推荐

