Saya pusing menulis ASP.NET selama dua hari terakhir, dan saya selalu ingin bermalas-malasan. Karena hampir setiap metode di kode latar belakang memerlukan try..catch, ini terasa sangat rumit. Ini juga mengingatkan saya pada AOP, tetapi metode AOP relatif rumit dan metodenya banyak. Misalnya menggunakan Dynamic Proxy, Attribute, atau Emit, dll. Tiba-tiba saya teringat fitur baru C# 2.0, delegasi anonim, dan menganggapnya agak jelek. . . Namun, pada kenyataannya, Anda juga dapat mensimulasikan efek AOP dengan cara yang relatif ringan:
// Persyaratan untuk memaksa kelas dasar halaman di asp.net tidak berlebihan. . .
TestLogger kelas parsial publik: PageBase {
protected void Page_Load(pengirim objek, EventArgs e) {
// Metode ini diimplementasikan di kelas dasar halaman, dan penanganan pengecualian umum, logika logging, dll. dapat diimplementasikan di dalamnya.
Coba Lakukan(
// Di sinilah hal sebenarnya dilakukan
delegasi() {
ke dalam a = 1;
ke dalam b = 0;
int c = a/b;
},
// Ini adalah penanganan pengecualian opsional. Jika Anda meneruskan null, pengecualian tersebut akan diabaikan begitu saja.
delegasi() {
Response.Write("Maaf, terjadi kesalahan.");
}
);
}
}
Kode implementasi di kelas dasar halaman sangat sederhana, dan juga dapat dikelola dengan mudah dan seragam. Di sini saya berasumsi bahwa saya hanya menggunakan log4net untuk mencatat pengecualian:
menggunakan Sistem;
menggunakan Sistem.Web.UI;
menggunakan log4net;
namespace SomeNamespace {
//Tentukan delegasi sederhana untuk meneruskan delegasi anonim
delegasi publik void MyAction();
//Tentukan kelas dasar halaman
kelas publik PageBase : Halaman {
logger ILog yang dilindungi;
// Semua logika penanganan pengecualian ditangani secara terpusat di kelas dasar halaman.
dilindungi kekosongan CobaLakukan(Aksi Saya doHandler, Tindakan Saya kecualiHandler) {
mencoba {
// Lakukan sesuatu yang praktis
doHandler();
} catch (Pengecualian misalnya) {
//Pencatatan pengecualian sederhana
logger.Error(ex);
// Beberapa pemrosesan lainnya
// . . .
// Panggil penanganan pengecualian khusus, tidak ada informasi spesifik tentang Pengecualian yang dikembalikan di sini. Karena toh tidak perlu menunjukkannya kepada pengguna. . .
jika (kecualiHandler != null)
kecualiHandler();
}
}
penggantian yang dilindungi void OnInit(EventArgs e) {
// Inisialisasi logger. Di sini GetType() bisa mendapatkan tipe subkelas sebenarnya
logger = LogManager.GetLogger(ini.GetType());
base.OnInit(e);
}
}
}
Oke, mari kita berhenti menulis di sini. Ini hanyalah ide sederhana saya. Tujuannya adalah untuk menerapkan manajemen pengecualian atau log terpusat dengan cara yang ringan. Tentu saja, hal ini tidak dapat dibandingkan dengan konsep AOP yang lengkap, tetapi meskipun demikian, tampaknya saat ini tidak ada kerangka kerja AOP yang sempurna di .NET.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_Exception_handling.html