不少剛學習.net core朋友對中間件的概念一直分不清楚,到底StartUp下的Configure方法是在做什麼? public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelop ...
不少剛學習.net core朋友對中間件的概念一直分不清楚,到底StartUp下的Configure方法是在做什麼?
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); }
大家都說每個request進來都會對Configure方法中的中間件執行一遍,但通過調試發現,只有程式在啟動時才會執行這段代碼,過後的每次請求並不會進入
下麵給大家簡單解釋一下:
假設有3個方法A B C,都有自己的業務邏輯,且參數類型與返回值類型相同
public Task MethodA(HttpContext context); public Task MethodB(HttpContext context); public Task MethodC(HttpContext context);
這個時候假設我通過某種手段將C方法放進B方法變成方法BC,類似:
public Task MethodBC(HttpContext context) { //方法B原先邏輯 return MethodC(context); }
同理將方法BC放進方法A變成方法ABC:
public Task MethodABC(HttpContext context) { //方法A原先邏輯 return MethodBC(context); } 展開後: public Task MethodABC(HttpContext context) { //方法A原先邏輯 //方法B原先邏輯 return MethodC(context); }
將原本互不幹執的3個方法揉進一個方法中,當伺服器接收到請求時,封裝好上下文丟進這個聚合方法
換個思路,感覺觀察者模式會不會更簡單些,IServer中寫個事件,有需要往裡面註冊就好了
那怎麼才可以將方法當個參數一樣使用呢,自然是委托,下麵官方的聲明:
中間件中最基礎的組件,以HttpContext為參數,Task作為返回值
delegate Task RequestDelegate(HttpContext context);
中間件的基本實現原理:
public RequestDelegate Use(RequestDelegate @delegate) { return (context)=> { //一些邏輯 return @delegate.Invoke(context); }; }
細細一想,是不是就是在@delegate前面加了一些邏輯後重新生成一個RequestDelegate返回
g