Winform 按鈕權限攔截AOP

最近在作winform的按鈕權限,要作的怎麼和BS中的同樣調用前攔截,參考了網上資料,目前最流行的AOP有3個。前端

POSTSHARP, 這個用不起要收費,還有一個Mono.ceils,這個不能作調試,並且還要對IL 要熟練,最後一個是大名鼎鼎的Castle,express

其中Castle 好像AOP都要使用接口,可是在winform的權限按鈕裏使用,那量太大可能會有性能影響,因此本身寫一個AOP,函數

首先創建一個權限類,全部的帶權限的調用都走這個類,性能

/// <summary>
    /// 權限基類
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BasePersmission<T> where T: class
    {

        public BasePersmission()
        {

        }

        Expression<Action<T>> expression = null;

        private T t = null;
      
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="t"></param>
        /// <param name="expression">表達式要執行的方法(M=>M.METHOD())</param>
        public BasePersmission(T t,Expression<Action<T>> expression)
        {
            this.t = t;
            this.expression = expression;
        }


        /// <summary>
        /// 是否有權限執行
        /// </summary>
        /// <returns></returns>
        private bool isHavPermission()
        {
            return true;
        }

        /// <summary>
        /// 執行前
        /// </summary>
        private void BeforeExecute()
        {

        }

        /// <summary>
        /// 執行後
        /// </summary>
        private void AfterExecute()
        {

        }

        /// <summary>
        /// 執行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void Execute()
        {
           
            if (isHavPermission())
            {
                BeforeExecute();
                expression.Compile()(t);
                AfterExecute();
            }
            else
            {
                throw new Exception("你沒有執行權限");
            }
          

        }
       

    }

  

在執行方法事件中調用Execute,this

執行前可作權限判斷,若是沒有按鈕權限則拋錯。調試

可作攔截同樣的功能,執行前的方法能夠在裏面寫如執行日誌,執行後能夠寫執行成功日誌。日誌

可是沒若是Expression中的方法執行失敗好像After不能執行,具體的按本身需求更新拋到前端的錯誤消息。orm

方法調用blog

   var pers = new BasePersmission<FrmUser>(this, (m) => m.QueryUser(txtUserId.Text.Trim(), txtUserName.Text.Trim()));

            pers.Execute();
相關文章
相關標籤/搜索