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

如何更优雅地实现数据集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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:16:02