营销增长
在 .NET 应用启动时对配置进行强类型绑定与快速失败校验
用 Microsoft.Extensions.Configuration 把 appsettings.json 绑定到强类型类,并在启动时校验配置,避免运行时才因配置错误崩溃。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 .NET 应用启动时对配置进行强类型通用
解决思路
- 定义设置类:为每个配置节创建一个 POCO 类,并声明 public const string SectionName = "..." 常量保存节名,属性给出合理默认值。
- 基本绑定:在 Program.cs 中用 builder.Services.AddOptions<T>().BindConfiguration(T.SectionName) 把配置节绑定到设置类,服务中通过构造函数注入 IOptions<T> 并读取 options.Value。
- 简单校验用 Data Annotations:在设置类属性上加 [Required]、[Range(1, 65535)]、[EmailAddress] 等特性,并在注册链上调用 .ValidateDataAnnotations()。
- 务必调用 .ValidateOnStart():否则校验只会在首次访问选项时执行,可能延迟到运行数分钟后才暴露问题。
- 复杂校验实现 IValidateOptions<T>:在 Validate(string? name, T options) 方法中收集 failures 列表,覆盖跨属性校验(如填了 Username 就必须填 Password)、条件校验(如 UseSsl 时端口不应为 25)、外部依赖校验等,最后返回 ValidateOptionsResult.Fail(failures) 或 ValidateOptionsResult.Success。
- 注册自定义校验器:用 builder.Services.AddSingleton<IValidateOptions<T>, TValidator>() 注册;Data Annotations 会先执行,然后执行 IValidateOptions,所有失败会一起汇总报告。
- 校验器可注入依赖:IValidateOptions 从 DI 解析,可注入 ILogger、IHostEnvironment 等,用于按环境做校验(如生产环境禁止 localhost 连接串、建议 Encrypt=True)或解析连接串格式(如 SqlConnectionStringBuilder)。
- 命名选项(Named Options):同一类型有多份实例时,用 AddOptions<T>("Primary").BindConfiguration("Databases:Primary") 分别注册,消费端用 IOptionsSnapshot<T> 的 options.Get("Primary") 获取;校验器中用 name 参数区分并加前缀到错误信息。
- 选择合适的选项生命周期:IOptions<T> 为单例、启动时读取一次、不随配置变化重载;IOptionsSnapshot<T> 为 Scoped、每次请求重新读取;IOptionsMonitor<T> 为单例、支持 OnChange 回调,适合后台服务实时响应配置变更。
- 后台服务用 IOptionsMonitor<T>:在构造函数中读取 CurrentValue 并订阅 OnChange 更新本地字段,在 ExecuteAsync 循环中使用最新设置。
- 用 PostConfigure 做后处理:在绑定之后、校验之前修改选项,如补全 BaseUrl 末尾的斜杠、设置默认 Timeout;也可用 PostConfigure<IHostEnvironment>((options, env) => ...) 按环境调整。
- 避免反模式:不要在服务中直接注入 IConfiguration 用 configuration["Smtp:Host"] 取值;不要在构造函数里做校验并抛异常;不要忘记 ValidateOnStart;不要在 IValidateOptions 中抛异常,而应返回 ValidateOptionsResult.Fail。
- 为校验器写单元测试:校验器是普通类,可直接 new 出来,用 xUnit + FluentAssertions 断言 result.Succeeded 与 result.FailureMessage 内容。
适用边界 · 注意事项
- 不使用 Microsoft.Extensions.Configuration / .NET 依赖注入体系的项目(如非 .NET 技术栈)不适用。
- 配置值在运行时频繁变化且无法在启动时确定合法性的场景,ValidateOnStart 会导致启动失败,应改用 IOptionsMonitor 做运行时校验。
- 仅需读取一两个简单字符串、且不需要强类型或校验的极简脚本场景,引入完整 Options 模式属于过度设计。