使用Autofac注册ConfigSection失效,注入后属性为默认值
核心问题1:配置节名称不匹配
你的注册代码中,获取配置节时用了nameof(BerichtModuleResilienceConfig),但配置文件里的节点是"MySettings",且配置类为MySettingsConfig,这会导致TryGetConfigSection找不到对应节点,绑定操作无效,最终mySettingsConfig还是默认值。
核心问题2:IOptions未正确注册
你的构造函数依赖IOptions<MySettingsConfig>,但仅注册了MySettingsConfig实例,Autofac不会自动将MySettingsConfig包装为IOptions<MySettingsConfig>,因此注入的是默认空IOptions对象。
修复步骤
步骤1:修正配置节获取逻辑
将配置节的获取改为对应配置文件中的节点名"MySettings":
var mySettingsConfig = new MySettingsConfig(); // 替换错误的节名称为"MySettings" config.GetSection("MySettings").Bind(mySettingsConfig);
注:若使用TryGetConfigSection,可改为var section = config.GetSection("MySettings"); section.Bind(mySettingsConfig);,确保绑定到正确节点。
步骤2:注册IOptions实例
由于类依赖IOptions<MySettingsConfig>,需将绑定好的配置实例包装成IOptions并注册:
// 先绑定配置实例 var mySettingsConfig = new MySettingsConfig(); config.GetSection("MySettings").Bind(mySettingsConfig); // 注册包装后的IOptions实例 builder.RegisterInstance(Options.Create(mySettingsConfig)) .As<IOptions<MySettingsConfig>>() .SingleInstance();
可选方案:直接依赖MySettingsConfig
若不需要IOptions的配置重载等特性,可修改MyClass构造函数,直接依赖MySettingsConfig:
public MyClass(MySettingsConfig mySettings) { // 此处可获取正确的RequestTimeout值 }
这种情况下,原注册代码builder.RegisterInstance<MySettingsConfig>(mySettingsConfig).SingleInstance();即可正常工作,前提是配置节绑定正确。
额外检查点
- 确认
appsettings.json的复制到输出目录设置为“如果较新则复制”或“始终复制”,保证程序运行时能读取到配置文件。 - 确认配置加载逻辑正确,比如构建
Configuration时是否正确添加了appsettings.json:
var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("Appsettings/appsettings.json", optional: false, reloadOnChange: true) .Build();
内容的提问来源于stack exchange,提问作者Bunnynut

