最近在做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();