0

我想在使用 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.更新了我的spring 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>

出于某种原因,如果我在其中设置断点,我的 Advice 代码不会受到影响。但是,如果我在我的建议中添加一些控制台日志记录语句,它们似乎已被记录,但不是在适当的时间(即,在调用 Listener.Handle() 之前)。

我愿意打赌我的配置是错误的(这一次,我可能错过了一种方法来告诉配置只监听 Handle 方法调用,而不是 Listener 可能拥有的任何其他方法)。有什么想法有什么问题吗?

4

1 回答 1

1

将您的Handle方法声明为虚拟方法:

public virtual void Handle()  // ...

您的类没有实现任何接口,spring.net 的默认 aop 机制使用这些接口来创建代理。当 spring.net 没有找到任何代理接口时,它会寻找虚拟方法来为类创建代理

于 2013-09-21T15:15:19.840 回答