在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想。

那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志、事务控制、缓存处理、权限控制等。

这些行为与商业核心业务逻辑是毫无关系的也就是可以完全剥离出来形成一个统一的解决方案,其实这就是Aop的核心思想。接下

来讲解关于微软提供的Unity组件中的AOP。

一、AOP中的几个概念

1):切面(Aspect):对横切性关注点的抽象,说白了就是对某种功能的抽象,日志、事务、权限等都是一个切面;

2):连接点(Joinpoint):在核心业务逻辑中可以进行切入的点,可以理解为切入点的集合(商业逻辑中可能要切入日志、权限、事务等,这些就是连接点);

3):切入点(Pointcut):指对连接点进行拦截的定义,切入点决定了Advice需要切入的具体连接点,Advice->Pointcut->Joinpoint;

4):通知(Advice):拦截到连接点之后所要做的事情(前置通知、返回后通知、环绕通知、抛出异常后通知等);

5):目标对象(Target Object):需要代理的目标对象,目标对象本身只剩下了干净的业务代码,日志、权限等功能需要AOP切入;

6):代理对象(Proxy Object) : 通过AOP容器产生的对象,是由Target Object与共有的Advice(日志、权限、事务)组成的;

7):织入(Weave):指将切面应用到target对象并导致proxy对象创建的过程称为织入(编译时发生,最终会在.dll文件中生成);

8):引入(Introduction):在不修改类代码的前提下,引入可以在运行期为类动态地添加一些方法或字段(运行时动态植入);

二、三种拦截方式

拦截类型 描述 使用条件
透明代理拦截(Transparent Proxy Interceptor) 实例拦截,代理对象是通过.NET的TransparentProxy/RealProxy创建的 当需要拦截的类型继承自MarshalByRefObject或其实现类
接口拦截(Interface Interceptor) 实例拦截,仅能代理目标对象的一个接口,resolve动态创建目标实例的代理类 当接口及其子类在容器中映射过
虚方法拦截(Virtual Method Interceptor) 类型拦截,动态创建当前拦截类型的派生类的实例而不是当前类型,并在实例上切入行为 仅当虚方法需要被拦截时

以上三种根据自己的使用场景自由选择,一般来说使用接口拦截的场景要多一些。以下是优势与劣势对比:

   1):Transparent Proxy Interceptor  

             优势是能拦截目标对象的所有方法包括虚方法、非虚方法或接口;

劣势是目标对象必须直接或间接继承自MarshalByRefObject,如果没有那么只能拦截接口方法,而且这种拦截比常规方法调用要慢。

2):Interface Interceptor

             优势是能够拦截目标接口的任何子类对象,而且比Transparent Proxy Interceptor要快速;

劣势是仅能拦截单一接口中的方法(A继承自接口B和C,如果拦截接口B则只能拦截B中的方法,不能拦截C中的方法),

而且代理对象不能强制类型转换为目标对象类型或目标对象实现的其他接口类型。

3):Virtual Method Interceptor

             优势是比Transparent Proxy Interceptor要快速;

劣势是只能拦截虚方法,而且只能在对象创建时进行拦截,而不能对一个已经存在的对象进行拦截。

            

三、接口拦截简单示例

1):怎么让容器支持拦截?

可以通过Unity自带的API为容器配置拦截特性让容器支持拦截,在UnityContainer的Extensions成员中可以看到InterceptionExtension

1 IUnityContainer container = new UnityContainer();
2 container.AddNewExtension<Interception>();

2):怎么让能够进行拦截的容器拦截需要拦截的接口类型?

需要为容器注册映射类型,使用RegisterType方法

1 container.RegisterType<TestInterface, TestClass>(
2 new Interceptor<InterfaceInterceptor>(),
3 new InterceptionBehavior<UnityLogInterceptBehavior>(),
4 new InterceptionBehavior<UnityCacheInterceptBehavior>());
1  Container.RegisterType(
2 interfaceType,
3 classType,
4 action,
5 new Interceptor<InterfaceInterceptor>(),
6 new InterceptionBehavior(new AccLogInterceptorBehavior()),
7 new InterceptionBehavior(new ExcpLogInterceptorBehavior()));

3):怎么能够让拦截行为生效?

只要有了目标对象的代理对象就能对目标对象的意代理接口中的方法进行拦截

1 var obj = container.Resolve<TestInterface>();   // 针对2中的第一种
1 var obj = container.Resolve(interfaceType, action);   // 针对2中的第二种

三、使用到的DLL

    Microsoft.Practices.Unity.dll

Microsoft.Practices.Unity.Interception.dll

附:

Demo下载路径:http://files.cnblogs.com/files/xy-nb/AopDemo.zip

以上只是对微软提供的Unity组件中Aop学习的一点笔记,比较适合初学者看看;有什么问题大家多多指正,相互学习。

Aop学习笔记的更多相关文章

  1. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  2. AOP学习笔记一

    软件开发的目的是为了解决各种需求,包括业务需求和系统需求.目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化.但是对于系统需求一类的关注点来说,情 ...

  3. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  4. Spring AOP学习笔记02:如何开启AOP

    上文简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解.从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了. 要使用 ...

  5. Spring AOP学习笔记03:AOP的核心实现之获取增强器

    上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...

  6. Spring AOP学习笔记05:AOP失效的罪因

    前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...

  7. AOP 学习笔记

    代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...

  8. AOP学习笔记二

    Spring AOP采用Java作为AOP的实现语言(AOL),学习曲线平滑,Spring AOP对AspectJ也提供了很好的集成与支持.最为第二代的AOP,采用动态代理机制和字节码生产技术实现,在 ...

  9. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

随机推荐

  1. Web安全基础实践

    Web安全基础实践 标签(空格分隔): <> 目录 基础问题回答 WebGoat下载安装 SQL注入攻击 - SQL字符串注入(String SQL Injection) - 数字型SQL ...

  2. Octocat,看着喜欢就都下载下来了

    看见github的octocat很喜欢,就用c#写了个程序统统download了,附上一个比较高效的下载程序,以及文末的图片压缩包. 用到了Jumony解析网页. HttpClient client ...

  3. MFC CTreeCtrl控件

    知识点: 认识CTreeCtrl CTreeCtrl控件属性 CTreeCtrl添加根项 CTreeCtrl添加子项 一.CTreeCtrl控件属性 先设置CTreeCtrl的属性: Has Line ...

  4. 蓝牙disable流程简述

    蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放. 这里简单说一下其流程,就直接从协议栈的disable的接口说起了. static int disable(v ...

  5. libgdx学习记录16——资源加载器AssetManager

    AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. ...

  6. 【ORACLE】oracle11g dg搭建

    --------------------------------每个节点和DG------------------------------------------------------------- ...

  7. Asp.Net_优化

    ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库 ...

  8. 英特尔帮助优化 Epic 的《堡垒之夜》* 和 Unreal Engine*

    您可能知道,Epic 的游戏<堡垒之夜>是 Unreal Engine* 技术的绝佳示例,<堡垒之夜>的开发团队正不断改进游戏,增加支持平台的数量并将信息反馈给引擎.为此,英特 ...

  9. 详细聊聊k8s deployment的滚动更新(二)

    一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍:   livenessProbe:存活性探测.判断pod是否已经停止   readinessProbe:就绪 ...

  10. 评审other's意见

    评审意见 1.组 a.界面不友好 b.没连数据库 2.组 a.没连数据库 b.无智能匹配当前时间 3.组 a.基本功能实现 b.界面未优化 4.组 ourselves 5.组 a.各反面较为完善 6. ...