广

ASP.NET

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-05 08:32:42 次阅读 稿源:互联网
    广告

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

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告