部分分支启动是否可能?
举个例子,是否可能有类似的东西:
public void Configure(IApplicationBuilder app,IHostingEnvironment env){ 应用….
的 简答 强> :
是。它会像你期望的那样工作。
实际上,当我们 Use() 一系列中间件,我们正在注册一系列中间件,这些中间件在处理请求时将按顺序调用。
Use()
该 MapWhen() 方法只不过是一个辅助方法 调用 Use() 。什么 MapWhen(predicate,configFn) 是注册运行的东西 如下 :
MapWhen()
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&amp;之前调用branch2。
else if
if
AlwaysUseThisMiddleware