论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Asp.net教程
Tag:静态页面,treeview,gridview,repeater,dataset,sqldatareader,ado.net,上传,三层,ajax,xml,留言本,新闻发布,商城,注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,触发器,socket,form认证,登录,视频教程

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

文章类别:Asp.net | 发表日期:2008-10-5 22:08:12

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

视频教程列表
文章教程搜索
 
Asp.net推荐教程
Asp.net热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058