在 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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值