No Buzzword AOP --- with AOP(Method interceptor) 
Posted on 2005-10-10 17:23 idior 阅读(980) 评论(6)  编辑 收藏 引用 网摘 所属分类: AOP  
在上文中, 已经将Print功能抽象成一个类, 从而达到减少重复代码的目的.
但是你肯定会在某些方面觉得不太舒服
   15         public double Speed
   16         {
   17             get
   18             {
   19                 return speed;
   20             }
   21             set
   22             {
   23                 propPrinter.Print(false,speed);
   24                 speed = value;
   25                 propPrinter.Print(true,speed);
   26             }
   27         }
虽然Print功能的定义集中到了一个类中, 但是调用Print功能的代码还是散布在各个地方.
减少重复的最高境界就是实现一个需求只有一处实现.
但是现在我们并没有做到这点, 我们仅仅实现了一个需求只有一处定义,但是有n处调用.
仔细思考一下面向对象能够解决这个问题吗?
为什么我们需要函数(结构化编程)?  --- 为了消除重复               需求:定义:调用=1:M:N (M<N)  
为什么我们需要类(面向对象)? --- 为了消除重复                     需求:定义:调用=1:1:N
为什么我们需要方面(面向方面)? --- 为了消除重复                   需求:定义:调用=1:1:1
AOP如何达到只有一处调用的呢? 面向对象并没有提供一个让我们定义调用的地方, 而AOP提供了这么一个地方---Aspect.
先来看看Aspect#中有关Aspect的定义: 
aspect PropertyAspect for Employer
     pointcut propertywrite(*)
           advice(PrinterInterceptor)
     end
end
Aspect文件的说明:
    其中我们可以看到for后面定义需要调用功能的那些类,这里为了简单起见我只定义了一个. 
    再来看pointcut.这里定义了类中的那些地方需要调用功能.这里我定义了类中的所有"写属性".也就是说当修改属性的时候就会调用到之前定义的功能. 
    那么调用什么功能,怎么调用就是在advice后面定义的PrinterInterceptor描述的. 
    9     public class PrinterInterceptor :IMethodInterceptor
   10     {
   11         public object Invoke(IMethodInvocation invocation)
   12         {
   13             PropertyPrinter printer=new PropertyPrinter();
   14             string propName=invocation.Method.Name.Substring(4);
   15 
   16             object originalValue=invocation.Method.DeclaringType.GetProperty(propName).GetValue(invocation.This,null);
   17             printer.Print(false,originalValue);
   18 
   19             object returnVal = invocation.Proceed();
   20 
   21             object modifiedValue=invocation.Method.DeclaringType.GetProperty(propName).GetValue(invocation.This,null);
   22             printer.Print(true,modifiedValue);
   23 
   24             return returnVal;
   25         }
   26     }
通过这些概念的定义我们就可以实现对功能调用的一次定义, 而不再象以前那样要手工的在各个类各个属性中调用我们的Print方法.
AOP 实现了 需求 :  实现 = 1 :  1 ,  最大程度地减少了重复. 现在你还要问什么是AOP了吗? AOP是不是可以被用在很多地方呢? 
注: 本文是AOP入门文章, 所有表述都是基于简单考虑.
示例下载
AOP Practice with AspectWeaver0.6 - DebugPropertyValueModifying   Teddy's Static IL Weaveing way
                             
Feedback
# re: No Buzzword AOP --- with AOP(Method interceptor)  回复  更多评论    
2005-10-11 08:49 by Baige 
不太明白的是:AOP将每个类的公用调用的代码部分提取到一个部分, 
他是怎么做到的?是采用一个框架吗? 
这样的框架集成到现有的程序中是否方便,是否会侵入现有代码, 
改动较大? 
比较疑惑啊~ 
# re: No Buzzword AOP --- with AOP(Method interceptor)  回复  更多评论    
2005-10-11 09:00 by idior 
本文是入门文章,目的就是告诉大家下面这个概念 
为什么我们需要方面(面向方面)? --- 为了消除重复 需求:定义:调用=1:1:1 
具体怎么做到的,看源代码吧还有其他的一些文章。 
# re: No Buzzword AOP --- with AOP(Method interceptor)  回复  更多评论    
2005-10-11 11:46 by young 
应该说这是我见过的最最简单的入门的关于aop的文章
# re: No Buzzword AOP --- with AOP(Method interceptor)  回复  更多评论    
2006-06-01 17:01 by 月の树 
作爲入門文章來説,寫得相當之不錯了~~~
# re: No Buzzword AOP --- with AOP(Method interceptor)  回复  更多评论    
2006-12-07 08:14 by nbob 
对我这种刚入门的人十分有用~~!谢谢作者~!~!