欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

AOP的一些概念和LOOM.NET

程序员文章站 2022-04-14 10:30:59
面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计、观点导向编程)是计算机科学中的一个术语,指一种程序设计范型。该范型以一...
面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计、观点导向编程)是计算机科学中的一个术语,指一种程序设计范型。该范型以一种称为侧面(aspect,又译作方面)的语言构造为基础,侧面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。
以上是AOP在*的概念,抽象晦涩。下面写一点本人的理解。如有错误,欢迎指出,不甚感激。
AOP中的涉及到的概念很多,眼花缭乱。但是AOP的思想却是很简单。就是分离代码。将最常用的,全局的方法分离出来,横向穿插到系统主干代码中。所谓横向穿插,就是这些代码并不是直接在主干代码中调用,而是通过某些机制,(比如反射等),在定义好的连接点处触发这些代码。连接点其实就是定义了何时触发代码。
AOP通常用在实现捕获异常,追踪异常,安全校验和失败注入等。在OO编程中,类和方法设计成执行专门的操作,一些常用的方法都被分散到公共类中。然而,有很多 (横切关注点)cross-cutting concerns穿越所有的类和方法,比如记录日志,权限检测。OOP中,用户定义不同的日志类和权限检测,在需要记日志或者权限校验的类或者方法中,调用这些日志类和权限类,部分的解决了这些问题。采用AOP,可以优雅的解决掉这些问题。
AOP中所谓的“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。通俗的说,就是把那些用来横插的函数,封装起来,在特定的时候就调用这些函数。因此,方面也就可以理解为用来横插的函数的封装库。这些方法在连接点处和目标方法编织。所谓编织,就是调用目标方法,必定会触发横插方法。
AOP中编织的方式有2种。分为动态和静态。
静态AOP系统诸如AspectJ,在编译时或者载入的时候编织 。 编织后的方面不能在运行时删除或者配置。静态编织通常通过实现MSIL或者字节码的重写来实现。
动态AOP系统可以在运行时编织方面。程序员在程序运行的时候动态的配置方面。
AOP系统的典型实现,无论静态编织还是动态编织,通常都是在执行点插入钩子(hook)。
这个执行点就是所谓的连接点。程序执行到连接点。钩子会拦截程序,并调用一段称作通知(advice)的代码。不同的通知可关联不同的切入点。一个方面就是一对切入点和通知。
静态编织的AOP中,hook通常由内嵌在代码中,通过静态翻译源代码或者字节码植入。
带编织的AOP,必须在每个连接点检测是否需要执行通知(advice)。在动态AOP中,所以的连接点都依赖于执行上下文,因为连接点是在运行时指定,有时还是动态的改变。因此,在连接点被改变后,必须重新检测是不是需要执行通知。
目前成熟的AOP语言要数AspectJ,是用于Java的。.NET中,比较成熟的比如 AspectDNG, Aspect#,PostSharp ,LOOM.NET。
LOOM.NET是一套开源的AOP系统,它有同时支持动态编织和静态编织。
动态编织的话,通过引入 RapierLoom.dll 程序集,编织过程在运行时由一个工厂类初始化。初始化的时候通过Create or CreateInstance 方法生成编织对象。
静态编织的话,编织过程发生在编译后。通过Gripper-LOOM.NET,在生成的程序集中重写入一些额外的“胶水代码”。编织步骤如下:首先生成.NET程序集,再对程序集运行命令行gl.exe。
AOP的一些概念和LOOM.NET