【问题标题】:How to set a spring.NET AOP advice before method call如何在方法调用之前设置 spring.NET AOP 建议
【发布时间】:2013-09-22 07:52:49
【问题描述】:

我想在使用 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 可能拥有的任何其他方法)。有什么想法吗?

【问题讨论】:

    标签: aop spring.net


    【解决方案1】:

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

    public virtual void Handle()  // ...
    

    你的类没有实现任何接口,这是spring.net默认的aop机制uses to create proxies。当 spring.net 没有找到任何代理接口时,它会寻找虚拟方法to create a proxy for a class

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多