如何在IConfiguration.Get<T>中标记字段忽略?能否混合配置与非配置字段?
.NET IConfiguration.Get 忽略字段及相关问题解答
能不能标记字段让配置绑定忽略?
完全可以,有两种常用方式:
1. 使用[BindNever]属性(推荐)
这是配置绑定专属的忽略标记,来自Microsoft.Extensions.Configuration.Binder命名空间,明确告诉配置绑定器跳过目标属性。修改你的代码如下:
using Microsoft.Extensions.Configuration.Binder; public class GeorgeClass { public string SourceName { get; set;} = string.Empty; public int MaxIterations { get; set;} = 0; [BindNever] public ConcurrentQueue<FredClass> QueuedItems {get; set;} = new(); public string[] IgnoreBobs {get; set;} = Array.Empty<string>(); }
添加该属性后,Get<T>绑定配置时会自动跳过QueuedItems,保留你初始化的默认值。
2. 将属性set改为init
如果把属性的setter改成init,配置绑定器无法在对象创建后为其赋值(init仅支持对象初始化阶段设置),因此会自动跳过这个属性:
public ConcurrentQueue<FredClass> QueuedItems {get; init;} = new();
这种方式的缺点是语义不够明确——其他开发者可能以为你只是想限制外部修改属性,而非故意让配置绑定忽略它,因此优先推荐使用[BindNever]。
同时包含配置字段和非配置字段是不是反模式?
不算反模式,但要注意类的职责边界:
- 如果非配置字段(比如
QueuedItems这类运行时状态)和配置逻辑关联紧密、数量不多,完全可以放在同一个类中,不会有问题。 - 如果后续非配置字段持续增加,导致类既承载配置又处理大量业务逻辑、职责混杂,建议拆分:单独创建
GeorgeSettings类专门承载配置,再在业务类中组合配置与运行时状态,更符合单一职责原则。
内容的提问来源于stack exchange,提问作者fziffle
相关产品推荐
相关产品推荐

