- View Code
- public interface ITypeFilter
- {
- bool Matches(Type type);
- }
- public interface IMethodMatcher
- {
- bool IsRuntime { get; }
- bool Matches(MethodInfo method, Type targetType);
- bool Matches(MethodInfo method, Type targetType, object[] args);
- }
Matches(MethodInfo, Type)方法用来测试这个切入点是否匹配目标类的指定方法。这将在AOP代理被创建的时候执行,这样可以避免在每次方法调用的时候都执行。如果两个参数的matches方法对于一个给定的方法返回true,并且IMethodMatcher接口的IsRuntime方法也返回true,那么有三个参数的matches方法将在每个方法调用时被调用. 这使得切入点在通知将被执行前可以查看传入到方法的参数。
绝大多数的IMethodMatcher接口是static的,这也就意味着它们的IsRuntime属性返回false.在这种情况下,有三个参数的Matches方法将永远不会被调用.
三. 通知
3.1 通知生命周期
3.2 通知类型
一、拦截环绕通知(around advice):Spring.NET中最基本的通知类型是拦截环绕通知(interception around advice),即方法拦截器。拦截环绕通知继承IMethodInterceptor接口。注意其中IMethodInvocation.Proceed()方法的调用。该方法会依次调用拦截器链上的其它拦截器。大部分拦截器都需要调用这个方法并返回它的返回值。当然,也可以不调用Proceed方法,而返回一个其它值或抛出一个异常,但一般不太会这么做。
二、前置通知(before advise):是在IMethodInterceptor.Proceed()方法调用前的通知。继承自IMethodBeforeAdvice接口。
三、异常通知(throws advise):是在IMethodInterceptor.Proceed()方法调用时发生异常的通知。继承自IthrowsAdvice接口。IthrowsAdvice接口没有定义任何方法:它是一个标识接口(按:之所以用标识接口,原因有二:1、在通知方法中,只有最后一个参数是必须的。如果声明为接口的方法,参数列表就被固定了。2、如果第一个原因可以用重载的接口方法解决,那么这个原因就是使用标识接口的充分原因了:实现此接口的类必须声明一或多个通知方法,接口方法做不到这一点),用以表明实现它的类声明了一或多个强类型的异常通知方法。
四、后置通知(after returning advise):是在IMethodInterceptor.Proceed()方法调用后的通知。继承自IAfterReturningAdvice接口。后置通知对切入点的执行没有影响,如果通知抛出异常,就会沿拦截器链向上抛出,从而中断拦截器链的继续执行。
3.2.1 Interception Around Advice(环绕拦截通知,后面的讲解以环绕拦截通知为例子)
方法拦截器接口
- View Code
- public interface IMethodInterceptor : IInterceptor
- {
- object Invoke(IMethodInvocation invocation);
- }
模拟环绕拦截通知
- View Code
- public class DebugInterceptor : IMethodInterceptor
- {
- public object Invoke(IMethodInvocation invocation)
- {
- Console.WriteLine("Before: invocation=[{0}]", invocation);
- object rval = invocation.Proceed();
- Console.WriteLine("Invocation returned");
- return rval;
- }
- }
注