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