ฉันเวียนหัวกับการเขียน ASP.NET มาสองวันแล้ว และฉันอยากจะขี้เกียจอยู่เสมอ เนื่องจากเกือบทุกวิธีในโค้ดพื้นหลังต้องใช้ try..catch จึงทำให้รู้สึกยุ่งยากมาก มันทำให้ฉันนึกถึง AOP เหมือนกัน แต่วิธีการของ AOP ค่อนข้างซับซ้อนและมีหลายวิธี ตัวอย่างเช่น ใช้ Dynamic Proxy, Attribute หรือ Emit เป็นต้น ทันใดนั้นฉันก็นึกถึงฟีเจอร์ใหม่ของ C# 2.0 ซึ่งเป็นการมอบหมายแบบไม่ระบุชื่อ และคิดว่ามันดูน่าเกลียดนิดหน่อย - - อย่างไรก็ตาม ในความเป็นจริง คุณสามารถจำลองผลกระทบของ AOP ด้วยวิธีที่ค่อนข้างง่าย:
// ข้อกำหนดในการบังคับคลาสฐานของเพจใน asp.net นั้นไม่มากเกินไป - -
TestLogger คลาสสาธารณะบางส่วน: PageBase {
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e) {
// วิธีการนี้ถูกนำมาใช้ในคลาสฐานของหน้า และสามารถใช้การจัดการข้อยกเว้นทั่วไป ตรรกะการบันทึก ฯลฯ ในนั้นได้
ลองโด(
// นี่คือที่ที่สิ่งต่าง ๆ เกิดขึ้นจริง
ผู้รับมอบสิทธิ์ () {
int = 1;
int ข = 0;
int c = a / b;
-
// นี่เป็นการจัดการข้อยกเว้นเพิ่มเติม หากคุณผ่านค่าว่าง ข้อยกเว้นจะถูกละเว้น
ผู้รับมอบสิทธิ์ () {
Response.Write("ขออภัย เกิดข้อผิดพลาด");
-
-
-
-
โค้ดการใช้งานในคลาสฐานของเพจนั้นง่ายมาก และยังสามารถจัดการได้อย่างง่ายดายและสม่ำเสมอ ที่นี่ฉันคิดว่าฉันใช้ log4net เพื่อบันทึกข้อยกเว้น:
ใช้ระบบ;
โดยใช้ System.Web.UI;
ใช้ log4net
เนมสเปซ SomeNamespace {
//กำหนดผู้รับมอบสิทธิ์แบบธรรมดาสำหรับส่งผ่านผู้รับมอบสิทธิ์ที่ไม่ระบุชื่อ
ผู้แทนสาธารณะถือเป็นโมฆะ MyAction ();
//กำหนดคลาสพื้นฐานของเพจ
PageBase คลาสสาธารณะ : หน้า {
ตัวบันทึก ILog ที่มีการป้องกัน
// ตรรกะการจัดการข้อยกเว้นทั้งหมดได้รับการจัดการจากส่วนกลางในคลาสฐานของหน้า
ป้องกันโมฆะ TryDo (MyAction doHandler, MyAction ยกเว้น Handler) {
พยายาม {
// ทำอะไรสักอย่างที่เป็นประโยชน์
ทำแฮนด์เลอร์();
} จับ (ข้อยกเว้นเช่น) {
//บันทึกข้อยกเว้นอย่างง่าย
logger.Error(เช่น);
// การประมวลผลอื่น ๆ
- - -
// เรียกการจัดการข้อยกเว้นแบบกำหนดเอง ไม่มีการส่งคืนข้อมูลเฉพาะของข้อยกเว้นที่นี่ เพราะไม่จำเป็นต้องแสดงให้ผู้ใช้เห็นอยู่แล้ว - -
ถ้า (ยกเว้นHandler != null)
ยกเว้นตัวจัดการ();
-
}
การป้องกันแทนที่เป็นโมฆะ OnInit (EventArgs e) {
// เตรียมใช้งาน Logger ที่นี่ GetType() สามารถรับประเภทที่แท้จริงของคลาสย่อยได้
คนตัดไม้ = LogManager.GetLogger(this.GetType());
base.OnInit(e);
-
-
-
เอาล่ะ เรามาหยุดเขียนที่นี่กันดีกว่า นี่เป็นเพียงความคิดง่ายๆของฉัน จุดประสงค์คือเพื่อใช้การจัดการข้อยกเว้นหรือบันทึกแบบรวมศูนย์ในลักษณะที่ไม่ซับซ้อน แน่นอนว่าสิ่งนี้เทียบไม่ได้กับแนวคิด AOP ที่สมบูรณ์ แต่ต้องบอกว่าขณะนี้ยังไม่มีกรอบ AOP ที่สมบูรณ์แบบใน .NET
http://www.cnblogs.com/Rchen/archive/2006/11/16/aspnet_Exception_handling.html