Последние два дня у меня кружилась голова при написании ASP.NET, и мне всегда хочется лениться. Поскольку почти каждый метод в фоновом коде требует try..catch, это кажется очень громоздким. Это также напоминает мне АОП, но метод АОП относительно сложен и существует множество методов. Например, используйте динамический прокси, атрибут или Emit и т. д. Я внезапно подумал о новой возможности C# 2.0 — анонимном делегировании — и подумал, что это немного некрасиво. . . Однако на самом деле вы также можете просто имитировать эффект АОП относительно простым способом:
// Требование принудительного использования базового класса страницы в asp.net не является чрезмерным. . .
публичный частичный класс TestLogger: PageBase {
protected void Page_Load (отправитель объекта, EventArgs e) {
// Этот метод реализован в базовом классе страницы, и в нем может быть реализована общая обработка исключений, логика журналирования и т. д.
ПопробуйСделать(
// Здесь делаются настоящие дела
делегат() {
интервал а = 1;
интервал б = 0;
интервал с = а/б;
},
// Это необязательная обработка исключений. Если вы передадите значение null, исключение будет просто проигнорировано.
делегат() {
Response.Write("К сожалению, произошла ошибка.");
}
);
}
}
Код реализации в базовом классе страницы очень прост, и им можно легко и единообразно управлять. Здесь я предполагаю, что просто использую log4net для регистрации исключений:
использование системы;
использование System.Web.UI;
используя
пространство имен log4net SomeNamespace {;
//Определяем простой делегат для передачи анонимных делегатов
публичный делегат void MyAction();
//Определяем базовый класс страницы
общедоступный класс PageBase: Page {
protected ILog logger
// Вся логика обработки исключений обрабатывается централизованно в базовом классе страницы.
protected void TryDo(MyAction doHandler, MyAction кромеHandler) {
пытаться {
// Делаем что-нибудь практичное
сделатьОбработчик();
} catch (исключение ex) {
//Простое протоколирование исключений
logger.Error(ex);
// Другая обработка
// . . .
// Вызов пользовательской обработки исключений, здесь не возвращается никакой конкретной информации об исключении. Потому что показывать это пользователю все равно не нужно. . .
если (кроме обработчика!= ноль)
кроме Обработчика();
}
}
protected override void OnInit(EventArgs e) {
// Инициализируем регистратор. Здесь GetType() может получить фактический тип подкласса.
logger = LogManager.GetLogger(this.GetType());
base.OnInit(e);
}
}
}
Ладно, хватит здесь писать. Это всего лишь моя простая идея. Целью является упрощенная реализация централизованного управления исключениями или журналами. Конечно, это несравнимо с полной концепцией АОП, но при этом создается впечатление, что в настоящее время не существует идеальной инфраструктуры АОП в .NET.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_Exception_handling.html