Winform 按钮权限拦截AOP

最近在做winform的按钮权限,要做的怎么和BS中的一样调用前拦截,参考了网上资料,目前最流行的AOP有3个。

POSTSHARP, 这个用不起要收费,还有一个Mono.ceils,这个不能做调试,而且还要对IL 要熟练,最后一个是大名鼎鼎的Castle,

其中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,

执行前可做权限判断,如果没有按钮权限则抛错。

可做拦截一样的功能,执行前的方法可以在里面写如执行日志,执行后可以写执行成功日志。

但是没如果Expression中的方法执行失败好像After不能执行,具体的按自己需求更新抛到前端的错误消息。

方法调用

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

            pers.Execute();

  

posted on 2018-05-06 15:21  陈-chen  阅读(709)  评论(0编辑  收藏  举报