ASP.NET MVC 透過四大過濾器(Authorization、Action、Result、Exception)實現 AOP。所有過濾器統一由 Filter 類別封裝,透過 IFilterProvider 機制提供。本文詳細說明 Filter 排序規則、三大內建 Provider 及 FilterAttribute 宣告式應用方式。
public class Filter
{
public object Instance { get; protected set; }
public int Order { get; protected set; }
public FilterScope Scope { get; protected set; }
}
public enum FilterScope
{
First = 0, Global = 10, Controller = 20, Action = 30, Last = 100
}
排序規則:Order 越小優先級越高(預設 -1);Order 相同時,Scope 枚舉值越小越優先。故同 Order 下:First > Global > Controller > Action > Last。
public interface IFilterProvider
{
IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
}
FilterAttribute 特性建立 Filter。IActionFilter),直接以 Controller 實例為 Filter。GlobalFilters.Filters.Add()),Scope 為 Global。FilterProviders.Providers 管理所有 Provider,FilterProviderCollection.GetFilters() 聚合所有 Filter。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited=true, AllowMultiple=false)]
public abstract class FilterAttribute : Attribute, IMvcFilter
{
public int Order { get; set; }
public bool AllowMultiple { get; } // 預設 false
}
特性可套用於類別(Controller 級)或方法(Action 級),對應 Scope 為 Controller/Action。AllowMultiple 控制是否允許同類特性重複套用。