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

是否过度设计?如何基于开闭原则动态读取配置节点MaxSize

如何避免配置读取的Switch-Case过度设计?

兄弟,你这个思路太对了!用一堆switch-case处理配置分支确实违反开闭原则,每次加新配置都要改老代码,时间长了肯定会变成“屎山”。你想的动态读取思路完全可行,我给你几个实用的方案,都是.NET生态里常用的解决办法:

方案1:反射动态读取

这就是你说的config.Value."sectionType".MaxSize的实现思路,通过反射根据字符串获取对应的属性:

// 获取配置对象的类型
var configType = config.Value.GetType();
// 根据sectionType获取对应的配置节属性
var sectionProperty = configType.GetProperty(sectionType);
if (sectionProperty != null)
{
    // 获取配置节实例
    var sectionInstance = sectionProperty.GetValue(config.Value);
    // 读取MaxSize属性值
    maxSize = (int)sectionInstance.GetType().GetProperty("MaxSize").GetValue(sectionInstance);
}
else
{
    // 处理不存在的配置节,比如设置默认值或抛出异常
    maxSize = 1024; // 示例默认值
}

⚠️ 注意:反射的性能略低,如果不是高频调用场景完全没问题;另外要保证sectionType的字符串和类的属性名完全一致(大小写敏感),不然会找不到属性。

方案2:字典映射(推荐)

这个方案比反射更安全、性能更好,而且完全符合开闭原则——新增配置时只需要往字典里加一行,不用修改原有读取逻辑:

// 可以在类的构造函数或者初始化方法里构建这个映射字典
var maxSizeMap = new Dictionary<string, Func<int>>
{
    { "AConfig", () => config.Value.AConfig.MaxSize },
    { "BConfig", () => config.Value.BConfig.MaxSize },
    { "CConfig", () => config.Value.CConfig.MaxSize }
};

// 读取MaxSize的时候直接从字典取
if (maxSizeMap.TryGetValue(sectionType, out var getMaxSize))
{
    maxSize = getMaxSize();
}
else
{
    // 处理未匹配的情况
    throw new ArgumentException($"不存在的配置节:{sectionType}");
}

新增配置时,比如加了DConfig,只需要在字典里追加一行{ "DConfig", () => config.Value.DConfig.MaxSize }就行,原有代码完全不用动,完美契合开闭原则。

方案3:利用配置系统原生特性(更优雅)

如果你用的是.NET的IConfiguration系统(读appsettings.json最常用的方式),可以直接利用配置系统的按节读取+类型绑定特性,先给所有带MaxSize的配置节定义一个统一接口:

// 定义一个统一接口,所有带MaxSize的配置节都实现它
public interface IConfigWithMaxSize
{
    int MaxSize { get; set; }
}

// 你的各个配置类实现这个接口
public class AConfig : IConfigWithMaxSize
{
    public int MaxSize { get; set; }
    // 其他属性...
}

public class BConfig : IConfigWithMaxSize
{
    public int MaxSize { get; set; }
    // 其他属性...
}

然后直接通过配置节名称绑定到接口:

// 直接根据sectionType读取对应的配置节并绑定
var configSection = config.GetSection(sectionType).Get<IConfigWithMaxSize>();
if (configSection != null)
{
    maxSize = configSection.MaxSize;
}
else
{
    // 处理未找到的情况
}

这个方案最优雅,完全利用了配置系统的能力,新增配置时只需要新增实现接口的配置类,同时在appsettings.json里添加对应节点即可,读取逻辑零修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:12:58