專案實作自訂 FilterUsingAttribute 同時繼承 FilterAttribute、IAuthorizationFilter、、IResultFilter,並透過 IOC 解析具體 Filter 實例:
public class FilterUsingAttribute : FilterAttribute, IAuthorizationFilter, IActionFilter, IResultFilter {
private readonly Type filterType; private object instantiatedFilter;
public FilterUsingAttribute(Type filterType) {
if (!IsFilterType(filterType)) throw new InvalidOperationException(...);
this.filterType = filterType;
}
private bool IsFilterType(Type type) {
return typeof(IAuthorizationFilter).IsAssignableFrom(type)
|| typeof(IActionFilter).IsAssignableFrom(type)
|| typeof(IResultFilter).IsAssignableFrom(type);
}
private T GetFilter<T>() where T : class {
if (instantiatedFilter == null)
instantiatedFilter = ServiceLocator.Current.GetInstance(filterType);
return instantiatedFilter as T;
}
private void ExecuteFilterWhenItIs<TFilter>(Action<TFilter> action) where TFilter : class {
var filter = GetFilter<TFilter>();
if (filter != null) action(filter);
}
public void OnAuthorization(AuthorizationContext filterContext) { ExecuteFilterWhenItIs<IAuthorizationFilter>(f => f.OnAuthorization(filterContext)); }
public void OnActionExecuting(ActionExecutingContext filterContext) { ExecuteFilterWhenItIs<IActionFilter>(f => f.OnActionExecuting(filterContext)); }
public void OnActionExecuted(ActionExecutedContext filterContext) { ExecuteFilterWhenItIs<IActionFilter>(f => f.OnActionExecuted(filterContext)); }
public void OnResultExecuting(ResultExecutingContext filterContext) { ExecuteFilterWhenItIs<IResultFilter>(f => f.OnResultExecuting(filterContext)); }
public void OnResultExecuted(ResultExecutedContext filterContext) { ExecuteFilterWhenItIs<IResultFilter>(f => f.OnResultExecuted(filterContext)); }
}

於 ContainerBuilder 註冊 Filter 為 Transient 元件,Action 標記 [FilterUsing(typeof(MyFilter))] 即可自動解析注入,實現 Filter 與業務邏輯解耦。