我想在使用spring.NET执行之前拦截方法调用。我们假设要拦截的类/方法是:
public class Listener
{
public void Handle()
{
// method body
}
}
这就是我所做的(假设所有代码都在名为Example的名称空间中):
1.处理好建议:
public class MyAopAdvice : IMethodBeforeAdvice
{
public void Before(MethodInfo method, object[] args, object target)
{
// Advice action
}
}
2.更新了我的春天xml配置:
<object id="myAopAdvice" type="Example.MyAopAdvice" />
<object id="listener" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="Target">
<object type="Example.Listener" autowire="autodetect"/>
</property>
<property name="InterceptorNames">
<list>
<value>myAopAdvice</value>
</list>
</property>
</object>
由于某种原因,如果我在其中添加断点,我的建议代码就不会受到影响。但是,如果我在我的建议中添加了一些控制台日志记录语句,它们似乎已被记录,但不是在适当的时候(即,在调用Listener.Handle()之前)。
我愿意打赌我的配置是错误的(一次,我可能会错过一种告诉配置只听Handle方法调用的方法,而不是监听器可能有的任何其他方法)。任何想法有什么不对?
答案 0 :(得分:1)
将您的Handle
方法声明为虚拟:
public virtual void Handle() // ...
你的类没有实现任何接口,spring.net的默认aop机制uses to create proxies。当spring.net找不到任何代理接口时,它会查找虚拟方法to create a proxy for a class。