Spring.NET 与 AOP 初窥1

时间:2024-01-04 17:59:20

(方面:如有错误,请勿喷,评论即可)

1.开始

什么是AOP?关于它的详细内容,可以自己用google搜索一下,能找到很多有趣的内容。事实上,现在的AOP只是对OOP的一个补充,还没有到达一个语言级别。 对于java世界里的AspectJ,我目测它的实现原理应该只是java的元编程(正如spring做的那样,只不过它提供了类似语法糖一样的东西,如果我理解错了,请java的同学们不要喷我)。

2.Spring

可以去下载它的最新版本,http://www.springsource.org/download/community  exe安装版

3.现学现卖

我先简单介绍一下AOP(参照第1条), aspect 意思可以有 切面、横面、方面或者侧面,*上面写的是侧面。 如果把OOP看做纵向的编程(继承,方法调用等等),那么AOP就是横向的编程。

4.OOP举例

日志是一个很好的例子,有一个在AOP观点中很搓的实现(我敢说大部分人都是这么实现的),就是trycatch 一段程序,在catch里写日志调用的方法,如果还要记录info,可能在程序某个地方写 logger.info

public void SomeBusinessMethod(){
  logger.Info(".........");
  try{
    Operate();
  }catch(Exception e){
    logger.Error(e.Message);
  }
  finally{
    Hehe();
  }
  logger.info();
}

  

5.AOP的反驳

呵呵,如果业务逻辑中这样的方法有上百个(其实也不用上百个,30个即可),你这样一个一个去实现日志功能,我敢打赌你写到第10个就感到厌倦了——重复代码。也有人可能说,可以用一个Context实现,对于日志这个例子,也许能省掉trycatch语句块,但你还是得一便一遍的调用info error等方法。

也许在 ASP.NET中,你可以看见 Page.OnError方法 ,或者Controller.OnException方法来处理异常,Page.OnLoad ,Page.OnUnload,Controller.OnActionExecuting,Controller.OnActionExecuted方法,但这事实上已经有点AOP的味道了

是的,你可以在把方法调用前,方法返回后或者异常作为连接点,通过切入点指定这些连接点做什么(通知)

6.解决方案——Spring.NET

参照第2条,安装完Spring后,在开始菜单招到Spring.NET,然后打开AOP示例项目 (example)

Spring.NET 与 AOP 初窥1

Common项目包含了Aspects和Commands的几个类,ServiceCommand实现了ICommand的三个成员

把Step1 设为启动项目, 打开Program.cs, 可以看到它用了ProxyFactory代理了ServiceCommand,然后给它增加了三个方面并创建了代理对象,最后调用代理对象的三个方法。详细代码可以在示例项目中找到。 注释表明了,这是一个programmatically (编程实现AOP)

// Create AOP proxy programmatically.
                ProxyFactory factory = new ProxyFactory(new ServiceCommand());
                factory.AddAdvice(new ConsoleLoggingBeforeAdvice());
                factory.AddAdvice(new ConsoleLoggingAfterAdvice());
                factory.AddAdvice(new ConsoleLoggingThrowsAdvice());
                ICommand command = (ICommand)factory.GetProxy();

                command.Execute();
                if (command.IsUndoCapable)
                {
                    command.UnExecute();
                }

  

截图如下(为了醒目起见,我加了点分隔线)

Spring.NET 与 AOP 初窥1

这样就为每个方法的前与后动态地添加了行为,这些行为就是通知(Advise)。

结合日志的例子,我们就可以很方便的为每个业务方法加上这些Advise,然后做日志操作,事实上示例项目做的就是日志。

可以看到有很多Advise——Before,After,Around(环绕)和ThrowAdvise