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();