为了账号安全,请及时绑定邮箱和手机立即绑定

在 .net 核心应用程序启动中使用 MapWhen 和 ApplicationBuilder

在 .net 核心应用程序启动中使用 MapWhen 和 ApplicationBuilder

C#
繁花不似锦 2022-10-23 13:58:52
是否可以进行部分分支启动?例如,是否有可能有类似的东西:public void Configure(IApplicationBuilder app, IHostingEnvironment env){    app.AlwaysUseThisMiddleware();    app.MapWhen(conditionA, appBuilder => {appBuilder.SometimesUseThisOne;})    app.MapWhen(conditionB, appBuilder => {appBuilder.SometimesUseThisOtherOne;})还是我需要把AlwaysUseThisMiddleware每个分支放在里面?像这样:public void Configure(IApplicationBuilder app, IHostingEnvironment env){    app.MapWhen(conditionA, appBuilder =>    {        appBuilder.AlwaysUseThisMiddleware(); // Duplicated        appBuilder.SometimesUseThisOne;    )    app.MapWhen(conditionB, appBuilder =>    {        appBuilder.AlwaysUseThisMiddleware(); // Duplicated        appBuilder.SometimesUseThisOtherOne;    )
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

简短的回答:


是的。它将按您的预期工作。


实际上,当我们Use()一系列中间件的时候,我们就是在注册一系列中间件,这些中间件在处理请求时会依次调用。


该MapWhen()方法只不过是调用Use(). 什么MapWhen(predicate,configFn)是注册运行如下的东西:


if (predicate(context)){

    await branch(context);

} else {

    await _next(context);

}

结果,当我们调用 时MapWhen(),我们正在注册另一个分支处理的中间件。


例如 :


app.UseMiddleware<AlwaysUseThisMiddleware>();                


app.MapWhen(ctx=>ctx.Request.Query["a"]=="1", appBuilder =>{

    appBuilder.UseMiddleware<SometimesUseThisOne>();

});


app.MapWhen(ctx=>ctx.Request.Query["b"]=="1", appBuilder =>{

    appBuilder.UseMiddleware<SometimesUseThisOtherOne>();

})


// ...

基本上,此代码以以下方式运行:


call  `AlwaysUseThisMiddleware`;


////////////////////////////////////

if (ctx.Request.Query["a"]=="1"){   

    call SometimesUseThisOne ;            

} else {

    //------------------------------------------

    if (ctx.Request.Query["b"]=="1"){

        call SometimesUseThisOtherOne ;

    } else {

        //##################################################

        await _next(context);  // call other middlewares ...

        //##################################################

    }

    //-----------------------------------------

}

////////////////////////////////////

或者,如果您愿意,也可以将其重写如下:


call `AlwaysUseThisMiddleware` middleware


if(ctx.Request.Query["a"]=="1")           // go to branch 1

    call `SometimesUseThisOne` middleware


else if (ctx.Request.Query["b"]=="1")     // go to branch 2

    call `SometimesUseThisOtherOne` middleware 


else :

    ...

注意这里是一个分支else if而不是if. 并且中间件AlwaysUseThisMiddleware 总是在 branch1 & branch2 之前调用。


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号