如何更优雅地实现数据集ID映射的条件逻辑重构?
优雅重构ID映射逻辑的方案
最简洁且易维护的方式是用字典集中管理映射规则,彻底消除冗余的if判断。以下是具体实现:
1. 基础版(硬编码规则)
首先在你的处理类中定义静态映射字典,把所有ID映射规则集中存放:
// 集中管理ID映射规则:原ID → (目标ID, 是否可删除) private static readonly Dictionary<int, (int TargetId, bool IsDeleteAble)> _datasetIdMap = new() { { 29, (28, true) }, { 30, (31, true) }, { 32, (31, true) }, { 33, (31, true) } };
然后修改Handle方法,用字典查找替代所有if:
public async Task<PagedResult<DataSetUpdateViewModel>> Handle(GetDataSetUpdateByDataSetIdQuery request, CancellationToken cancellationToken) { // 检查当前ID是否需要映射 if (_datasetIdMap.TryGetValue(request.ID, out var mapping)) { request.ID = mapping.TargetId; request.DeleteAble = mapping.IsDeleteAble; } var datasetUpdates = _context.DatasetUpdates .Where(c => request.ID > 0 && c.DatasetId == request.ID) .ProjectTo<DataSetUpdateViewModel>(_mapper.ConfigurationProvider, new { isDeleteAble = request.DeleteAble }); return await datasetUpdates .DynamicOrderBy("UpdateDate", "DESC") .GetPagedAsync(request.PageNumber, request.PageSize, cancellationToken); }
优点
- 所有规则集中管理,新增/修改映射只需要更新字典,无需改动逻辑代码
- 消除冗余判断,代码更简洁易读
- 符合开闭原则,扩展新规则时无需修改原有逻辑
2. 进阶版(动态配置规则)
如果映射规则需要频繁调整,或者不想硬编码在代码里,可以从配置文件读取规则,实现动态配置:
步骤1:在appsettings.json中添加配置
"DatasetIdMappings": [ { "OriginalId": 29, "TargetId": 28, "IsDeleteAble": true }, { "OriginalId": 30, "TargetId": 31, "IsDeleteAble": true }, { "OriginalId": 32, "TargetId": 31, "IsDeleteAble": true }, { "OriginalId": 33, "TargetId": 31, "IsDeleteAble": true } ]
步骤2:定义配置绑定类
public class DatasetIdMapping { public int OriginalId { get; set; } public int TargetId { get; set; } public bool IsDeleteAble { get; set; } }
步骤3:在处理类中注入配置并初始化字典
private readonly Dictionary<int, (int TargetId, bool IsDeleteAble)> _datasetIdMap; // 构造函数注入IConfiguration public YourHandlerClassName(IConfiguration configuration, YourDbContext context, IMapper mapper) { _context = context; _mapper = mapper; // 从配置文件读取映射规则并转换为字典 var mappings = configuration.GetSection("DatasetIdMappings").Get<List<DatasetIdMapping>>(); _datasetIdMap = mappings.ToDictionary(m => m.OriginalId, m => (m.TargetId, m.IsDeleteAble)); }
步骤4:Handle方法逻辑和基础版完全一致
这样后续修改映射规则时,只需要修改配置文件,无需重新编译代码,灵活性更高。
内容的提问来源于stack exchange,提问作者Lube
相关产品推荐
相关产品推荐

