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

是否存在app.UseWhenElse()替代方案?避免重复调用判断方法

解决方案:自行实现UseWhenElse扩展方法

ASP.NET Core原生确实没有UseWhenElse方法,但自行实现它完全合理,不属于重复造轮子——因为原生UseWhen仅覆盖了条件为真的分支场景,而你的需求(一次性判断条件并处理两个分支)是原生功能的合理补充,且能避免条件方法被重复执行的问题。

实现代码

创建一个针对IApplicationBuilder的扩展方法,内部一次性判断条件后路由到对应的分支管道:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;

public static class ApplicationBuilderExtensions
{
    public static IApplicationBuilder UseWhenElse(
        this IApplicationBuilder app,
        Func<HttpContext, bool> condition,
        Action<IApplicationBuilder> configureWhenTrue,
        Action<IApplicationBuilder> configureWhenFalse)
    {
        // 分别构建两个分支的中间件管道
        var truePipeline = app.New();
        configureWhenTrue(truePipeline);
        var trueBranch = truePipeline.Build();

        var falsePipeline = app.New();
        configureWhenFalse(falsePipeline);
        var falseBranch = falsePipeline.Build();

        // 添加核心中间件,一次性判断条件后执行对应分支
        return app.Use(async (context, next) =>
        {
            bool conditionResult = condition(context);
            if (conditionResult)
            {
                await trueBranch(context);
            }
            else
            {
                await falseBranch(context);
            }

            // 执行后续中间件(与原生UseWhen行为保持一致)
            await next();
        });
    }
}

使用方式

完全符合你理想中的用法:

app.UseWhenElse(
    context => context.Condition(), 
    applicationBuilder => { /* 条件为true时的中间件配置 */ }, 
    applicationBuilder => { /* 条件为false时的中间件配置 */ }
);

优势说明

  1. 避免重复执行条件方法:仅在中间件内部执行一次condition(context),解决了原写法中条件方法被调用两次的问题。
  2. 与原生行为对齐:保留了UseWhen的核心特性——分支管道执行完成后会继续执行后续中间件(若不需要此行为,可移除await next();)。
  3. 代码更简洁:将两个分支的逻辑聚合在一处,比两次调用UseWhen的写法更易读和维护。

内容的提问来源于stack exchange,提问作者Wim ten Brink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:45:27