如何用Fluent模式重构C#中的嵌套If条件判断逻辑?
用Fluent模式重构C#多层嵌套服务调用逻辑
原始代码通过多层嵌套if依次调用服务接口,仅在前一个调用返回HttpStatusCode.OK时才执行后续操作,代码嵌套层级深,可读性差:
var response1 = service.AddSchool(model, a); if (response1.StatusCode == HttpStatusCode.OK) { var response2 = service.AddTeacher(model, a, b); if (response2.StatusCode == HttpStatusCode.OK) { var response3 = service.AddStudent(model, a, b, c); if (response3.StatusCode == HttpStatusCode.OK) { var response4 = service.AddSubject(model, a); return true; } } }
实现方案
通过自定义执行上下文类+扩展方法可以实现Fluent风格的链式调用,核心是用一个上下文对象承载当前执行状态,通过扩展方法判断状态后决定是否执行后续操作。
1. 定义执行上下文类
这个类用来保存当前执行是否成功的状态,也可扩展存储其他上下文数据:
public class FluentExecutionContext { public bool IsSuccess { get; private set; } public FluentExecutionContext(bool initialSuccess = true) { IsSuccess = initialSuccess; } // 内部更新状态的方法 internal void SetSuccess(bool success) { IsSuccess = success; } }
2. 编写Fluent扩展方法
定义Then扩展方法,提供两个重载:一个直接接收判断成功与否的委托,另一个适配返回HttpResponseMessage的服务调用,自动判断状态码:
public static class FluentExecutionExtensions { // 基础重载:接收自定义成功判断逻辑 public static FluentExecutionContext Then(this FluentExecutionContext context, Func<bool> action) { if (context.IsSuccess) { context.SetSuccess(action()); } return context; } // 适配服务调用的重载:自动判断StatusCode是否为OK public static FluentExecutionContext Then(this FluentExecutionContext context, Func<HttpResponseMessage> action) { return context.Then(() => { var response = action(); return response.StatusCode == HttpStatusCode.OK; }); } }
3. 重构后的调用代码
用链式调用替代嵌套if,代码简洁易读:
var executionContext = new FluentExecutionContext() .Then(() => service.AddSchool(model, a)) .Then(() => service.AddTeacher(model, a, b)) .Then(() => service.AddStudent(model, a, b, c)) .Then(() => service.AddSubject(model, a)); return executionContext.IsSuccess;
扩展说明
- 如果需要传递前一步的调用结果(比如用新增学校的ID创建老师),可以扩展
FluentExecutionContext添加LastResult属性,调整扩展方法支持带参数的委托。 - 可新增
Catch扩展方法,在执行失败时触发自定义处理逻辑,增强容错性。
内容的提问来源于stack exchange,提问作者sunil
相关产品推荐
相关产品推荐

