使用Sprint.Net进行AOP编程

参考<Sprint.net 手册>

一、简介

aop是oop的补充.aop把程序分解为一系列方面或关注点。aop将事务管理、日志管理、错误管理、安全控制等横向分布在多个对象中的关注点进行了模块化处理。

sprint.net的ioc容器与aop框架是相互独立的,两者完全可以不依赖对方面单独使用

二、aop基本概念

方面(aspect): 对横向分布在多个对象中的关注眯所做的模块化。spring.net将方面实现为advisor或interceptor。advisor是通知和切入点的组合,interceptor实际就是指通知。在spring.net中一般会把环绕通知称为拦截器.

连接点(joinpoint):程序执行过程中的一个点。例如对某个方法的调用或者某个特定异常抛出都可以称为连接点.

通知(advice):aop框架在某个连接点所采取的行为。通知有多种类型。包括”环绕”通知,前置通知和异常通知等。

切入点(pointcut):指通知的应用条件。用于确定某个通知要被应用到哪 个连接点上。

引入(introduction):向目标对象添加方法或字段的行为。

目标对象(target object):指包含连接点的对象。即被通知或被代理的对象

aop代理(aop proxy):由aop框架在将通知应用于目标对象后创建的对象.

织入(weaving):将方面进行组装,以创建一个目标对象。

三、通知类型:

环绕通知(around advise):包围某个连接点的通知。充许在方法调用的前后执行自定义行为。它可以决定是让连接点继续执行,还是用自己的返回值或异常将连接“短路”

前置通知(before advise):在连接点执行前执行.

异常通知(throws advise):当连接点抛出异常时执行.

后置通知(after returning advise):在连接正常执行完成后执行。

四、应用通知

首选引用 Spring.Aop.dll

  (1)通知目标对象

   1: public interface ICommand
   2: { 
   3:        object Execute(object context);    
   4: }        
   5: public class ServiceCommand : ICommand    
   6: { 
   7:        public object Execute(object context)
   8:         {            
   9:             Console.WriteLine("Service implementation : [{0}]", context);
  10:             return null;
  11:         }
  12: }
 
(2)环绕通知
引入命名空间 
 using AopAlliance.Intercept;
   1: public class ConsoleLoggingAroundAdvice : IMethodInterceptor
   2: {
   3:         public object Invoke(IMethodInvocation invocation)
   4:         {
   5:             Console.WriteLine("Advice executing; calling the advised method..."); 
   6:             object returnValue = invocation.Proceed();  
   7:             Console.WriteLine("Advice executed; advised method returned " + returnValue); 
   8:             return returnValue; 
   9:         }
  10: }

(3)将通知应用到通知目标对象上

引入命名空间

using Spring.Aop.Framework;

   1: static void Main(string[] args)
   2: {
   3:             ProxyFactory factory=new ProxyFactory(new ServiceCommand());
   4:             factory.AddAdvice(new ConsoleLoggingAroundAdvice());
   5:             ICommand command=(ICommand)factory.GetProxy();
   6:             command.Execute("this is the argument");
   7:             Console.ReadLine();
   8: }

 

ProxyFactory类的构造器以目标对象做为参数。然后通过ProxyFactory的AddAdvice()方法向这个目标添加了一个通知,这个通知会应用到目标对象的所有方法上去,随后通过调用ProxyFactory实例的GetProxy()方法获得一个代理——也就是目标对象(ServiceCommand的实例)的AOP代理。当调用代理的Execute方法时。通知就被“应用了”(或者说被执行了)

posted @ 2012-12-18 12:36  淡竹叶  阅读(1403)  评论(0编辑  收藏  举报