如何重构配置流程消除冗余,避免新增配置遗漏问题?
配置管理优化方案建议
我们的配置规范分为三步:
- 构建84个配置实例
- 定义这84个配置间的167个关联关系
- 将全部84个配置加入一个联合配置
目前存在两个核心问题:
- 第三步冗余:需要手动编写84行代码逐个添加配置到联合配置中
- 易遗漏:新增配置时经常忘记将其加入联合配置
我曾尝试合并第一步和第三步,但这样会导致第二步无法引用这些配置实例,因此寻求改进建议。
相关代码示例:
var x = X.Build() var y = Y.Build() var z = Z.Build() // 重复84次 x.AddRelation(y) x.AddRelation(z) // 重复167次 var config = new Config(...) { Entities = { x, y, z, // 重复84次 } }
优化方案
方案1:用集合统一存储配置实例
构建配置时直接存入集合,关联操作从集合中获取实例,最后将整个集合赋值给联合配置的Entities属性。
示例代码:
// 第一步:构建并存储所有配置 var configEntities = new List<IConfigEntity> { X.Build(), Y.Build(), Z.Build() // 剩余81个配置... }; // 第二步:通过集合查找实例建立关联 var x = configEntities.OfType<XConfig>().Single(); var y = configEntities.OfType<YConfig>().Single(); var z = configEntities.OfType<ZConfig>().Single(); x.AddRelation(y); x.AddRelation(z); // 剩余164个关联... // 第三步:直接赋值集合,无需重复罗列 var config = new Config(...) { Entities = configEntities };
- 优势:彻底消除第三步冗余代码,新增配置只需在集合中添加,不会遗漏
- 注意点:若有同类型多实例,需用名称等标识替代
OfType+Single来查找
方案2:构建时自动注册到全局容器
给所有配置类的Build方法添加自动注册逻辑,将实例存入静态容器,关联操作从容器取实例,最后从容器提取所有实例到联合配置。
示例代码:
// 定义静态容器 public static class ConfigContainer { public static List<IConfigEntity> Entities { get; } = new(); } // 修改Build方法(以X为例) public static XConfig Build() { var config = new XConfig(...); ConfigContainer.Entities.Add(config); return config; } // 使用流程 // 第一步:构建配置(自动注册到容器) var x = X.Build(); var y = Y.Build(); var z = Z.Build(); // 剩余81个... // 第二步:直接用变量或容器查找建立关联 x.AddRelation(y); x.AddRelation(z); // 剩余164个... // 第三步:直接从容器获取所有实例 var config = new Config(...) { Entities = ConfigContainer.Entities };
- 优势:无需手动维护集合,新增配置调用
Build就自动加入联合配置,彻底避免遗漏 - 注意点:要确保
Build方法不会重复添加实例;多线程环境需考虑容器线程安全
方案3:用构建器模式封装整个流程
创建配置构建器,统一管理配置实例的创建、关联定义和联合配置生成。
示例代码:
public class ConfigBuilder { private readonly Dictionary<Type, IConfigEntity> _entities = new(); public T AddConfig<T>(Func<T> buildFunc) where T : IConfigEntity { var config = buildFunc(); _entities[typeof(T)] = config; return config; } public void AddRelation<TFrom, TTo>() where TFrom : IConfigEntity where TTo : IConfigEntity { var from = (dynamic)_entities[typeof(TFrom)]; var to = _entities[typeof(TTo)]; from.AddRelation(to); } public Config BuildFinalConfig(/* 联合配置参数 */) { return new Config(...) { Entities = _entities.Values.ToList() }; } } // 使用方式 var builder = new ConfigBuilder(); // 第一步:添加配置 var x = builder.AddConfig(X.Build); var y = builder.AddConfig(Y.Build); var z = builder.AddConfig(Z.Build); // 剩余81个... // 第二步:添加关联 builder.AddRelation<XConfig, YConfig>(); builder.AddRelation<XConfig, ZConfig>(); // 剩余164个... // 第三步:生成联合配置 var config = builder.BuildFinalConfig(...);
- 优势:流程封装后逻辑更清晰,新增配置只需调用
AddConfig,不会遗漏;关联定义更简洁 - 注意点:若需同类型多实例,需扩展构建器支持名称等标识区分;动态调用
AddRelation需确保所有配置类都有该方法
内容的提问来源于stack exchange,提问作者Little Helper
相关产品推荐
相关产品推荐

