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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:17:16