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