首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 笔记本电脑 | 北大青鸟 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> ASP.NET >> 正文

匿名委托简单模拟AOP做异常和日志处理

    这两天写 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.
【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·开源软件测试工具学习专题
 ·JSP Web开发 入门基础到高手进阶教程…
 ·JavaFX—是Java桌面的新希望么?
 ·安全至上 .NET开发安全策略…
 ·测试用例设计之道-测试用例学习专题
 ·面向Java开发人员的Scala指南
 ·Java设计模式之实例详解
 ·Oracle数据库11g 面向DBA和开发人员的重要新特性…
 ·桌面应用软件编程 J2SE技术详解…
 ·我“炫”我精彩-------WPF开发教程
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航