لقد شعرت بالدوار أثناء كتابة ASP.NET خلال اليومين الماضيين، وأريد دائمًا أن أكون كسولًا. نظرًا لأن كل طريقة تقريبًا في كود الخلفية تتطلب محاولة..التقاط، فإنها تبدو مرهقة للغاية. إنه يذكرني أيضًا بـ AOP، لكن طريقة AOP معقدة نسبيًا وهناك العديد من الطرق. على سبيل المثال، استخدم Dynamic Proxy أو Attribute أو Emit وما إلى ذلك. فكرت فجأة في الميزة الجديدة لـ C# 2.0، وهي التفويض المجهول، واعتقدت أنها قبيحة بعض الشيء. . . ومع ذلك، في الواقع، يمكنك أيضًا محاكاة تأثير AOP بطريقة خفيفة نسبيًا:
// إن متطلبات فرض فئة أساسية للصفحة في asp.net ليست زائدة عن الحاجة. . .
فئة عامة جزئية TestLogger: PageBase {
باطلة محمية Page_Load(object sender, EventArgs e) {
// يتم تنفيذ هذه الطريقة في الفئة الأساسية للصفحة، ويمكن تنفيذها فيها معالجة الاستثناءات العامة ومنطق التسجيل وما إلى ذلك.
حاول القيام(
// هذا هو المكان الذي تتم فيه الأمور الفعلية
مندوب() {
كثافة العمليات = 1؛
كثافة العمليات ب = 0؛
كثافة العمليات ج = أ / ب؛
},
// هذه معالجة استثناء اختيارية. إذا مررت بقيمة فارغة، فسيتم تجاهل الاستثناء ببساطة.
مندوب() {
Response.Write("عذرًا، حدث خطأ.");
}
);
}
}
رمز التنفيذ في الفئة الأساسية للصفحة بسيط جدًا، ويمكن أيضًا إدارته بسهولة وبشكل موحد. أفترض هنا أنني ببساطة أستخدم log4net لتسجيل الاستثناءات:
باستخدام النظام؛
باستخدام System.Web.UI؛
باستخدام
مساحة الاسم SomeNamespace {
// تحديد مفوض بسيط لتمرير المفوضين المجهولين
المفوض العام باطلة MyAction();
// تحديد الفئة الأساسية للصفحة
PageBase للفئة العامة: الصفحة {
protected ILogger;
// تتم معالجة كل منطق معالجة الاستثناءات مركزيًا في الفئة الأساسية للصفحة.
محمي باطلة TryDo(MyAction doHandler, MyAction باستثناءHandler) {
يحاول {
// افعل شيئًا عمليًا
doHandler();
} قبض (استثناء على سبيل المثال) {
// تسجيل استثناء بسيط
logger.Error(ex);
// بعض المعالجة الأخرى
// . . .
// استدعاء معالجة الاستثناءات المخصصة، لا يتم إرجاع أي معلومات محددة عن الاستثناء هنا. لأنه ليست هناك حاجة لإظهاره للمستخدم على أي حال. . .
إذا (باستثناءHandler ! = فارغة)
باستثناءHandler();
}
}
تجاوز محمي باطلة OnInit (EventArgs e) {
// تهيئة المسجل هنا فقط يمكن لـ GetType () الحصول على النوع الفعلي للفئة الفرعية
logger = LogManager.GetLogger(this.GetType());
base.OnInit(e);
}
}
}
حسنًا، لنتوقف عن الكتابة هنا. هذه مجرد فكرة بسيطة مني. والغرض من ذلك هو تنفيذ الإدارة المركزية للاستثناءات أو السجلات بطريقة خفيفة. بالطبع، هذا لا يمكن مقارنته بمفهوم AOP الكامل، ولكن بعد قولي هذا، يبدو أنه لا يوجد حاليًا إطار عمل AOP مثالي في .NET.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_exception_handling.html