前言
本篇介紹.net core批量攔截器的用法,自帶Filter和Castle動態代理都有各自適用的場景;
1、.net core 自帶Filter
1)添加全局Filter,比如錯誤處理、日志記錄等;
(錯誤處理Filter)
(日志記錄)
(注冊全局攔截器)
注冊完全局攔截器后,如果某些請求不需要上面攔截器時,可以通過定義一個屬性的形式,在攔截器中判斷該請求方法上是否帶有該屬性,從而判斷中是否要攔截;攔截邏輯在上圖中的LoggerFilter中的IsNoNeedLogger方法來判斷;
2)添加局部Filter(非批量添加,但是該方法比常規用法簡潔並實用)
(定義屬性,並繼承攔截接口)
(定義類,並繼承TypeFilterAttribute)
(使用時,以屬性的形式並可傳參)
2、Castle動態代理(結合Autofac使用)
引入包Autofac.Extras.DynamicProxy,Castle.Core等,定義攔截器;
定義不需要攔截的地方 (在方法上標注這個屬性時,代表不需要攔截,攔截邏輯如上圖)
在Autofac的注冊方法中,給某些局部類上批量添加攔截器;
總結:
1)在適用場景上,自帶Filter適合添加全局攔截器,以及某個具體請求方法上已屬性的形式添加攔截器,均是在Controller層的;Castle動態代理適合添加局部性的批量攔截器,在接口層(或者說實現層),常規用法不是在Controller層;
2)當你既有自帶Filter添加的全局攔截器以及Castle動態代理的攔截器,當一個請求過來時,在執行順序上來說,會先在Controller層執行自帶Filter的全局攔截器方法,然后在接口層分別執行每個被調到的接口所添加的攔截器方法;
3)關於TypeFilter和ServiceFilter,當使用ServiceFilter時,需要提前注冊該攔截器,而已無法傳參,所以本篇采用的是TypeFilter,由於它無法注冊,而且可以傳參,雖然ServiceFilter可以在注冊時決定使用任意的生命周期,比如Scope,來達到不用每次重新實例化,但是TypeFilter也有IsReusable的參數來彌補;
4)關於Autofac批量注冊,可以看上一篇文章 https://www.cnblogs.com/willardzmh/articles/14393696.html