AOP(面向切面编程概念,本文为翻译)
Posted DripRoad
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP(面向切面编程概念,本文为翻译)相关的知识,希望对你有一定的参考价值。
AOP是什么
AOP为Aspect Oriented Programming的缩写。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
详情请自行百度或者Google: AOP In .Net 的应用
AOP的应用场景
AOP的最大优势是,你只需要担心方面在一个地方,编程一次和应用所需的所有地方。AOP有很多用途,例如:
- 日志(Logging):在应用程序中实现日志记录
- Authentication(身份校验):使用身份验证之前的操作(如允许一些操作只有通过身份验证的用户)。
- 数据校验(Validation or Notificatio):实施验证或通知属性setter(调用propertychange事件当属性已经改变了类,实现INotifyPropertyChanged接口)。
- 行为改变(Changing the behavior):改变一些方法的行为。
如您所见,AOP有许多用途,但是你必须小心使用它。它将保留一些代码在你的视线范围之内,但它鈥檚仍然存在,在每次调用运行方面存在的地方。它可以有缺陷和严重影响应用程序的性能。一个微妙的错误可能花费你很多方面的调试时间。如果你的方面是鈥檛使用在许多地方,有时候鈥檚最好直接将它添加到代码。
AOP实现使用一些常见的技巧:
- 添加预处理程序源代码中使用,如在c++中。
- 使用后处理器添加指令编译后的二进制代码。
- 使用一种特殊的编译器编译时添加代码。
- 使用一个代码在运行时拦截器,拦截执行并添加所需的代码。
在.Net框架,其中最常用的技术是后处理和代码拦截。前者所使用的技术是PostSharp(postsharp.net),后者使用依赖注入(DI)容器,如Castle DynamicProxy(bit . ly / JzE631)和Unity (unity.codeplex.com)。这些工具(指依赖注入容器)通常使用 装饰者设计模式 或 代理 执行代码拦截
应用AOP的优点和缺点
AOP的最大优势是,你只需要担心方面在一个地方,编程一次和应用所需的所有地方。AOP有很多用途,例如:
- 在应用程序中实现日志记录。
- 使用身份验证之前的操作(如允许一些操作只有通过身份验证的用户)。
- 实施验证或通知属性setter(调用propertychange事件当属性已经改变了类,实现INotifyPropertyChanged接口)。
- 改变一些方法的行为。
如您所见,AOP很有用,但是你必须小心使用它。尽管AOP代码实现在不用的类里,,在每次调用运行时AOP都存在于相应的地方。它可能有缺陷,也有可能严重影响应用程序的性能。一个细小的切面Bug可能花费你太多的调试时间。如果你的AOP是至少使用在某一处的时候,最好直接将它添加到代码。
AOP实现使用一些常见的技巧:
- 添加预处理程序源代码中使用,如在c++中。
- 使用后处理器添加指令编译后的二进制代码。
- 使用一种特殊的编译器编译时添加代码。
- 使用一个代码在运行时拦截器,拦截执行并添加所需的代码。
在。净框架,其中最常用的技术是后处理和代码拦截。前者是PostSharp所使用的技术(postsharp.net),后者使用依赖注入(DI)容器,如城堡了DynamicProxy(bit . ly / JzE631)和统一(unity.codeplex.com)。这些工具通常使用一个叫装饰的设计模式或代理执行代码拦截。
知识延伸=》装饰设计模式
装饰设计模式解决了一个常见的问题:你有一个类和想要添加一些功能。你有几个选择:
- 你可以直接向类添加新的功能。然而,这个类不止一个职责,同时也不符合“单一职责”原则。
- 你可以创建一个新类,让这个功能去调用它旧类的对应方法。但是,这会带来一个新问题:如果你还想使用没有新功能的类,将会怎样?
- 你可以创建一个新类,让新类继承旧类,添加新的功能,但这可能导致许多新类。例如,也就是说你有一个存储库类创建、读取、更新和删除(CRUD)数据库操作和您想要添加审计。然后,您想要添加数据验证来确保数据被正确更新。再之后,您可能还希望验证访问,以确保只有授权用户可以访问的类。这些都是大问题:你可以有一些类,实现三个方面,或者实现其中两方面,甚至只有其中一方面。最后你将会有多少类?
- 你可以用外包装来来修饰这些类,创建一个具有切面功能的新类,然后调用旧类。这样,如果你需要一个方面,你包裹它一次。两个方面,你包装两次,等等等。比如说你订购一个玩具(正如我们是极客,Xbox或智能手机)。首先它需要一个具有足够大空间和保护功能的最外层的包装。然后,对于第2层包装,您可以订购一个磁带润,条纹、卡片和礼物纸的盒子。第3层包装,一个由具有防易碎功能的聚苯乙烯泡沫塑料球包裹它。现在他有三层外包装,每一个外包装有不同的功能,且每一外包装都彼此独立。你可以买一个没有礼品包装盒,甚至没有任何包装玩具(特别不折扣!)。你可以按照你的想法任意组合去包装你玩具,但是他们并不改变玩具所具有的功能
AOP参考
本文翻译自 :https://msdn.microsoft.com/en-us/magazine/dn574804.aspx(面向切面编程)
以上是关于AOP(面向切面编程概念,本文为翻译)的主要内容,如果未能解决你的问题,请参考以下文章