c# AOP编程:

之前做AgentBooking时候,遇到两个问题比较棘手,一个是异常的传递与捕获:如何可以合理地在层层代码调用中统一传递并统一捕获异常。因为如果有一个做法,可以地方统一处理异常,可以使代码减少很多try cath逻辑,也不同时刻关注该怎么抛异常,这样代码写起来就比较happy。

第二个是Log的统一记录。和第一个问题一样,如果可以找到一种方法,可以统一记Log,不用再在代码中时刻关注什么时候该怎么记Log,这肯定是一种更好的改进。

上两个星期去Search了一下AOP(面向切面编程),其思想很大程度上可以给我们提供帮助。AOP大概意思就是说,在代码的编译期或者运行期自动为程序插入额外的功能逻辑。其思想就是将主要业务逻辑和辅助功能分离出来。在MOE中有一个经典的应用场合:每次MOE在调用Web Service时候,都回家RQ序列号并保存到一个txt的Log文件中,所以这个调用webservice的方法既有主要业务逻辑(RQ的生成)的代码,又有RQ入Log的辅助功能。如果应用AOP,则这个方法中只需要写主要业务的逻辑,RQ入LOG的逻辑代码可以交给AOP框架自动在编译期动态(或静态)“插入”到原来的代码里面。

AOP实现手段大概有两种,一是在编译是对代码的IL进行分析,然后插入(官方叫“织入”)额外功能的代码。二是对方法调用进行拦截并执行额外代码逻辑。

.NET中对方法调用进行拦截主要是通过context对象。参考资料:AOP研究context与拦截

这里主要介绍一下context与方法拦截。(因为IL涉及到编译器,太深奥,不明觉厉,而方法拦截除了AOP,感觉还可以用在其他地方)

在.NET中,每个App Domain(应用程序域,在.net中一个进程可以有N个线程,一个线程可以有N个App Domain)都至少有一个Context,当一个对象被new出来后,就是存在于context中。(我觉得context是更是一种编程思想,就是将资源都放在一个地方。典型的有HttpContext,就集中包含了每个HttpRequest访问时的一些信息)。.net程序第一个context是一个默认context,每个context都有一个ContextID.可以通过Thread.CurrentContext来访问当前Context。

.net里的对象从context的角度可以分为两种:context-aglie object(上下文灵活对象)和context-bound object(上下文绑定对象)。context-aglie object总是存在于这个对象的调用者所在的context中(我查了一下资料,大概是这个意思,但我还没有验证过是不是这样)。对context-aglie object的调用是一种直觉引用,并不是通过代理的调用。这个很重要,因为直接的调用是不能被拦截的,只有通过“代理”的调用才能被拦截,见下文。

而另一种是context-bound object(上下文绑定对象)。如果一个对象继承了ContextBoundObject ,就成了一个context-bound object。 context-bound object会被强制绑定到一个指定的context中。当一个调用者和被调用的对象处于不同的context中时,这个调用不是直接的引用,而是需要通过代理去进行的。正是因为有这个“代理”,才能在调用过程中做手脚,例如在调用这个对象的一个方法前或调用方法完毕后做一些额外的逻辑(如Log,或者方法执行的时间统计等等),听起来很熟悉?在HttpModule中也是这种做法。

这里的“代理”有几种:远程代理(Remote Proxy),虚拟代理(Virtual Proxy),智能引用代理(Smart Reference Proxy).在.NET Remoting中,代理又分为透明代理(Transparent Proxy)和真实代理(Real Proxy)

方法调用的拦截就需要用到透明代理和真实代理。当一个对象调用另一个context里的对象(比如说调用该对象的某个方法),这个调用到达透明代理时会被转换为一个Message,并将Message传给Real Proxy。Real Proxy将Message传到这个对象的过程中,Message会经历由N个MessageSink(消息槽)组成的管道中。每个MessageSink可以对消息进行处理并再次抛给下一个MessageSink,一直将调用传递到那个Object为止。每个MessageSink中便是我们拦截方法调用的地方了。

提供一个基于Context拦截的Logger 日志组件Demo: AOP Logger

时间: 2025-01-04 15:34:17

c# AOP编程:的相关文章

聊聊Javascript中的AOP编程

Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla 这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过du

聊Javascript中的AOP编程

我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过duck typing.举一

spring 手工实现AOP编程

AOP概述: AOP,aspect object programming 面向切面编程 功能:让关注点代码与业务代码分离! 关注点:重复代码就叫做关注点. 切面:关注点形成的类,就叫做切面(类)! 面向切面编程,就是指 对很过功能都有的重复性代码抽取,再在运行的时候往业务方法上动态的植入"切面类代码" 切入点:执行目标对象方法,动态植入切面代码. 可以通过切入点表达式,指定拦截那些类的方法,给指定的类在运行的时候植入切面类代码. 手工方式实现AOP编程(这里我们采用动态代理的方式,并且

使用spring方式来实现aop编程

1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 面向对

spring 注解&XML实现AOP编程

注解方式实现AOP编程 注解方式步骤: 1) 先引入aop相关jar文件           (aspectj  aop优秀组件) spring-aop-3.2.5.RELEASE.jar    [spring3.2源码] aopalliance.jar                 [spring2.5源码/lib/aopalliance] aspectjweaver.jar               [spring2.5源码/lib/aspectj]或[aspectj-1.8.2\lib

黑马程序员--Java高新(10)_动态代理和AOP编程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一, 动态的核心 动态代理的两个核心,Proxy 和 InvocationHandler,都是Java.lang.reflect包下的接口类;由此也可以看出动态代理是反射的高级应用! 代理与反射的关系如何体现?从代理的建立过程的构建方法及其参数可见一斑: 1,代理最核心的Handler的唯一方法invoke()的核心参数Method method,是一个Class类型,并且在代理调用时,inv

struct2.1笔记03:AOP编程和拦截器概念的简介

1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程. 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况

spring相关—AOP编程简介

1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充. 作用:本质上来说是一种简化代码的方式     继承机制     封装方法     动态代理     -- ●AOP编程操作的主要对象是切面(aspect),而切面模块化横切关注点. ●在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必

Spring学习-4-手动实现AOP编程

AOP面向切面编程 AOP可以实现“业务代码”和“关注点代码”完全分离 @Override public List<Message> findAllMessage() { Session session = null; //关注点代码 Transaction tx = null; try{ session = HibernateUtils.getSession(); tx = session.beginTransaction(); //关注点代码 Query q = session.creat

【Unity】AOP编程--拦截,用于缓存和异常处理

第一步:定义拦截行为:CachingBehavior 和 ExceptionLoggingBehavior 他们都继承接口:IInterceptionBehavior (程序集 Microsoft.Practices.Unity.Interception.dll, v2.1.505.0 命名空间:Microsoft.Practices.Unity.InterceptionExtension) 需要实现连个接口: public IEnumerable<Type> GetRequiredInter