使用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方法时。通知就被“应用了”(或者说被执行了)