如何优化ASP.NET Core 5中处理Requirement增改的控制器Action代码?
你的代码主要的冗余点在于Create_Requirement和Update_Requirement两个方法逻辑高度重复,且作为公开Action却仅被内部调用,存在不必要的路由暴露风险,以下是具体优化方案:
优化点1:删除冗余公开Action,合并重复逻辑
两个子Action不需要对外暴露,改成私有方法,或者直接将逻辑合并到主方法中,减少重复代码:
public async Task<JsonResult> Process_Requirement(Requirement model) { // 前置校验模型合法性 if (!ModelState.IsValid) { return Json(new { success = false, data = model, msg = "参数不合法" }); } bool isCreate = model.Id == 0; Requirement result; string operation = isCreate ? "create" : "update"; try { result = isCreate ? await _requirement.CreateAsync(model) : await _requirement.UpdateAsync(model); return Json(new { success = true, data = result.Id, operation = operation }); } catch (Exception ex) { // 建议替换为项目使用的日志框架记录完整异常,不要仅打印控制台 Console.WriteLine(ex.Message); return Json(new { success = false, data = model, operation = operation }); } }
优化后直接删除了两个冗余的子Action,代码量减少一半,逻辑也更连贯。
优化点2:下沉判断逻辑到仓储层(可选)
如果你的多个业务场景都需要用到新增/更新的判断,可以直接在仓储层封装UpsertAsync方法,控制器不需要关心底层逻辑:
// 仓储层扩展方法 public async Task<Requirement> UpsertAsync(Requirement model) { return model.Id == 0 ? await CreateAsync(model) : await UpdateAsync(model); }
此时控制器代码可以进一步简化:
public async Task<JsonResult> Process_Requirement(Requirement model) { if (!ModelState.IsValid) { return Json(new { success = false, data = model, msg = "参数不合法" }); } string operation = model.Id == 0 ? "create" : "update"; try { var result = await _requirement.UpsertAsync(model); return Json(new { success = true, data = result.Id, operation = operation }); } catch (Exception ex) { // 用日志框架记录完整异常信息,方便线上排查问题 _logger.LogError(ex, "处理需求{Operation}失败,Id:{Id}", operation, model.Id); return Json(new { success = false, data = model, operation = operation }); } }
其他可选优化建议
- 新增幂等性校验:更新场景下建议先判断Id对应的数据是否存在,避免传入不存在的Id导致更新报错
- 统一返回值结构:整个项目的接口返回值可以统一格式,固定包含success、code、msg、data字段,方便前端统一处理
- 避免吞异常:如果是线上环境不要只打印控制台日志,要记录完整的堆栈信息,必要时可以通过全局异常过滤器统一处理异常返回,不需要每个方法都写try/catch
内容的提问来源于stack exchange,提问作者Yanayaya
相关产品推荐
相关产品推荐

