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

asp.net

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

时间: 2024-07-31 02:24:07

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

【C#2.0】发挥匿名委托的威力!

   这几天研究了一下Linq,C# 3.0中的"扩展方法"特性为IEnumerable<T>增加了诸如Where.Select等查询方法,这使得"语言集成查询"成为顺其自然的事情.而C#3.0中Linq的实现也是建立在C#2.0的匿名委托的特性之上.   今天,我尝试在C#2.0中使用匿名委托模拟C#3.0中Where.Select等查询方法的实现.我将所有的查询方法作为静态方法在GenericHepler静态类中实现.   之前,我们先定义泛型委托:

如何在ASP.NET中用OWC绘制图表(1)

asp.net|图表 如何在ASP.NET中用OWC绘制图表 (1) 一.概述 二.设置图表引擎 三.OWC的许可证问题 四.OWC的运行机制 五.在Web服务器上安装OWC 10 六.OWC编程模式 ━━━━━━━━━━━━━ 正文: ━━━━━━━━━━━━━ 一.概述 在开发应用程序时,经常会遇到必须提供交互式图表的情况.例如,你可能在开发一个管理销售和产品数据的应用程序,数据保存在SQL Server数据库上,应用程序允许用户添加数据.更新现有数据,但除了这些功能之外,客户还要求应用程序

使用Action、Func,EventHandler,params关键字修饰的参数的匿名委托和Lambda表

使用Action.Func,EventHandler,params关键字修饰的参数的匿名委托和Lambda表达式 在.NET在,我们经常使用委托,委托的作用不必多说,在.NET 2.0之前,我们在使用委托之前,得自定义一个委托类型,再使用这个自定义的委托类型定义一个委托字段或变量..NET 2.0给我们带来了Action.Func两个泛型委托,.NET3.0给我们带来了Lambda,这一切使得委托的定义和使用变得简单起来.下面的例子中的委托都使用了Lambda表达式. 一.Action系列的泛型

为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数

Codeusing System;using System.Collections.Generic;using System.Linq;using System.Text; using System.Diagnostics; namespace ConsoleApplication1{    static class Program    {        static void Main(string[] args)        {            //Predicate       

asp.net中用sqlclient访问数据库出错解决办法

asp.net|client|访问|解决|数据|数据库 asp.net中用sqlclient访问数据库出错错误现象:login failed for user:pole\aspnet解决办法:在命令行运行如下命令osql -E -S (local)\NetSDK -Q "sp_grantlogin 'POLE\ASPNET'" osql -E -S (local)\NetSDK -d Pubs -Q "sp_grantdbaccess 'POLE\ASPNET'"o

C# 2.0的委托与匿名委托

delegate经常被人用来与回调相比较,其实两者在某种程度上由很多共同点.不过delegate有很多更加强大的地方. 首先,delegate中可以注册任意多个回调,在一个delegate被调用的时候,已经注册的过程将会被逐个调用. 其次,delegate允许注册一个对象的方法,而不像C++中指可以使用静态方法或者全局方法作为函数指针,提供了更多的灵活性,同时也暗示我们,delegate中按照某种方式保存了object的很多信息. 在C#2.0的匿名delegate中,我们甚至可以访问当前匿名委

asp.net导出excel的简单方法

 这篇文章主要介绍了asp.net导出excel的简单方法实例,需要的朋友可以参考下 excel的操作,最常用的就是导出和导入,废话不多说上代码.   本例使用NPOI实现的,不喜勿喷哈....    代码如下: /// <summary>         /// 导出Excel         /// </summary>         /// <param name="stime"></param>         /// <

c#-用C#简单模拟超市收银碰到的问题

问题描述 用C#简单模拟超市收银碰到的问题 class SuperMarket { WareHouse CangKu = new WareHouse(); //CangKu.GoodsIn("DreamCar", 100);这么写会报错 public SuperMarket() { CangKu.GoodsIn("DreamCar", 100); CangKu.GoodsIn("Apple", 800); CangKu.GoodsIn("

【HDU 4452 Running Rabbits】简单模拟

两只兔子Tom和Jerry在一个n*n的格子区域跑,分别起始于(1,1)和(n,n),有各自的速度speed(格/小时).初始方向dir(E.N.W.S)和左转周期turn(小时/次). 各自每小时往E.N.W.S中一个方向跑speed格,每隔turn小时左转一次(即逆时针的下一个方向). 行走中若第i步将碰壁,则第i步及剩余步改为原方向的相反方向(即折返). 两只兔子若在第i小时到达同一点,则交换彼此的方向再走下一小时:若相遇时有兔子恰好该左转,则放弃此次左转. 第一眼像搜索,后来发现只是简单