首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 範例專案「Suteki.Shop」分析:Filter 屬性與 IOC 整合

     編輯:關於ASP.NET

專案實作自訂 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)); }
}

Filter 類別圖

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved