在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理

王朝asp·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

这两天写 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.

http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_exception_handling.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航