一.用過濾器來偷懶
使用過濾器的好處是實(shí)現(xiàn)關(guān)注點(diǎn)分離,盡量偷懶,避免重復(fù)代碼。
本文主要是介紹過濾器在webapi中的常用使用方法,但過濾器不是專屬于webapi,甚至消息隊(duì)列中都可以使用過濾器。
關(guān)于在asp.net core mvc中使用過濾器可以參考官方的英文文檔或者國內(nèi)的翻譯文檔
本文使用的代碼:ZHS
二.用法舉例說明
1.身份驗(yàn)證
這里不涉及到具體那種技術(shù)實(shí)現(xiàn)的身份驗(yàn)證,使用Microsoft.AspNetCore.Authorization自帶的驗(yàn)證,可以看到,[Authorize()]會去執(zhí)行對應(yīng)的驗(yàn)證(此處500是因?yàn)闆]有具體的驗(yàn)證,無法執(zhí)行),而[AllowAnonymous](允許任何人)和不加過濾器標(biāo)簽是可以訪問的。如果使用了全局的身份驗(yàn)證過濾器,這里的[Authorize]和 [AllowAnonymous]是會覆蓋掉之前的全局身份過濾器。
可以肯定的一點(diǎn):合理使用全局和局部過濾器就可以使我們避免寫過多的邏輯。

身份過濾器

Authorize()

AllowAnonymous
2.異常處理
使用異常過濾器避免自己手寫一大堆try catch和記錄日志,同時對特定錯誤進(jìn)行特定的處理是很有效果的。除了必須的日志記錄,友好的返回結(jié)果也是很有意義的,如果是mvc可以直接返回一個對用戶友好的錯誤頁面,webapi則看情況是否要返回錯誤信息。

異常處理

異常返回結(jié)果
需要注意一點(diǎn):在方法年內(nèi)對異常進(jìn)行try catch會覆蓋掉異常過濾器的處理結(jié)果。如下圖,在使用異常過濾器的控制器中try catch返回結(jié)果。

try catch 處理

try catch 結(jié)果
3.模型綁定
這是最常見也是最偷懶的地方,如果不使用過濾器,你控制器可能是如下圖:

不用模型驗(yàn)證的處理
而現(xiàn)在結(jié)合模型驗(yàn)證可以將邏輯轉(zhuǎn)移到視圖模型里面:

模型驗(yàn)證
而原來的過濾器就會瘦身:

不需要再寫驗(yàn)證邏輯的控制器
由于模型驗(yàn)證是比較常用和具有普適性的,所以我在這里使用如下的全局過濾器(避免Startup膨脹,使用擴(kuò)展方法):

模型綁定的過濾器

全局調(diào)用
這樣偷懶的結(jié)果也如預(yù)期:

數(shù)字是必需的

數(shù)字必須在1到1000之間
本文采用 知識共享署名-非商業(yè)性使用-相同方式共享 3.0 中國大陸許可協(xié)議
轉(zhuǎn)載請注明:作者 張蘅水