這兩天寫 asp.net 寫暈了,老想偷點懶。由于在后臺的代碼里幾乎每個方法里都要 try..catch 這么來一遍,感覺很煩瑣。又聯想到 aop, 但 aop 的做法相對比較復雜,做法也很多。比如用 dynamic proxy, attribute, 或者 emit 等。我忽然聯想到了 c# 2.0 的新特性匿名委托,覺得這個雖然丑一點。。。不過其實也可以比較輕量級的簡單模擬 aop 的效果:
// asp.net 里面強制做一個頁面基類的要求是不過分的。。。
public partial class testlogger: pagebase {
protected void page_load(object sender, eventargs e) {
// 這個方法實現在頁面基類里面,可以往里面實現通用的異常處理,日志邏輯等。
trydo(
// 這個里面干實際的事情
delegate() {
int a = 1;
int b = 0;
int c = a / b;
},
// 這是一個可選的異常處理,如果傳遞一個 null 就會干脆忽略異常
delegate() {
response.write("sorry, 發生了一個錯誤。");
}
);
}
}
在頁面基類里面的實現代碼就很簡單了,也可以方便的統一管理。這里我假定僅僅簡單的用 log4net 來對異常做日志記錄:
using system;
using system.web.ui;
using log4net;
namespace somenamespace {
// 定義一個簡單的委托用于傳遞匿名委托
public delegate void myaction();
// 定義頁面基類
public class pagebase : page {
protected ilog logger;
// 頁面基類里面集中處理所有異常處理邏輯
protected void trydo(myaction dohandler, myaction excepthandler) {
try {
// 干點兒實際的事情
dohandler();
} catch (exception ex) {
// 簡單的記錄異常
logger.error(ex);
// 其他一些處理
// 。。。
// 調用自定義的異常處理,這里沒有回傳 exception 的具體信息。因為反正沒有必要對用戶顯示了。。。
if (excepthandler != null)
excepthandler();
}
}
protected override void oninit(eventargs e) {
// 初始化 logger. 正好這里 gettype() 可以取到子類的實際類型
logger = logmanager.getlogger(this.gettype());
base.oninit(e);
}
}
}
好了,先寫到這里。這只是我的一個簡單想法。目的在輕量級的實現異常或日志的集中管理。當然這個和完整的 aop 概念是沒法比的,不過話說回來,好像目前在 .net 中還沒有很完美的 aop framework.
新聞熱點
疑難解答
圖片精選