【问题标题】:I could use a app.UseWhenElse() method, but it does not exist. Is there an alternative?我可以使用 app.UseWhenElse() 方法,但它不存在。有其他选择吗?
【发布时间】:2023-01-05 22:58:03
【问题描述】:

这会很有趣:

app.UseWhenElse(
    context => context.condition(), 
    applicationBuilder => { /* Condition is true */ }, 
    applicationBuilder => { /* Condition is false */ }
});

这将允许我进行基于条件的路由并在一个中间件中处理两个分支。但它不存在。所以我必须使用这个丑陋的结构:

app.UseWhen(
    context => context.condition(), 
    applicationBuilder => { /* Condition is true */ }
});
app.UseWhen(
    context => !context.condition(), 
    applicationBuilder => { /* Condition is false */ }
});

现在,问题是 context.condition() 在这里被调用了两次,这是一个方法,而不是一个值。我不希望此方法执行两次,所以我正在考虑自己编写一个 UseWhenElse()。但我是在重新发明轮子吗?

【问题讨论】:

  • UseWhen 只是一个扩展方法,为什么不自己写一个呢?我会说这比写这个问题花费的时间更少。

标签: c# .net-7.0 minimal-apis


【解决方案1】:

我想它看起来像这样:

public static IApplicationBuilder UseWhenElse(this IApplicationBuilder    app,
                                              Func<HttpContext, bool>     predicate,
                                              Action<IApplicationBuilder> trueConfig,
                                              Action<IApplicationBuilder> elseConfig) {
    if (app == null) {
        throw new ArgumentNullException(nameof(app));
    }
    if (predicate == null) {
        throw new ArgumentNullException(nameof(predicate));
    }
    if (trueConfig == null) {
        throw new ArgumentNullException(nameof(trueConfig));
    }
    if (elseConfig == null) {
        throw new ArgumentNullException(nameof(elseConfig));
    }

    var trueBranchBuilder = app.New();
    trueConfig(trueBranchBuilder);

    var elseBranchBuilder = app.New();
    elseConfig(elseBranchBuilder);

    return app.Use(main => {
        trueBranchBuilder.Run(main);
        var trueBranch = trueBranchBuilder.Build();

        elseBranchBuilder.Run(main);
        var elseBranch = elseBranchBuilder.Build();

        return context => predicate(context) ? trueBranch(context) : elseBranch(context);
    });
}

虽然还没有测试过,让我知道它是否有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多