【问题标题】:Spring.Net Interceptors not firing when inherited from a base class从基类继承时 Spring.Net 拦截器不会触发
【发布时间】:2014-01-21 03:07:28
【问题描述】:

我在使用 Spring.Net 的 AOP 时遇到问题。如果给定的方法是从基类继承的方法,拦截器似乎不会触发。

但是,如果我重写从基类继承的方法,拦截器就会触发。

有没有办法让拦截器在不覆盖基地的情况下开火?

这是我目前所拥有的:(this example 的修改版):

public class HomeController : BaseController
{
    //**Uncommenting this will work**
    //public override void Delete()
    //{
    //    base.Delete();
    //}
}

public class BaseController : Controller
{
    [SetMethodInfoAsMessage]
    public virtual void Delete()
    {

    }
}

public class SetMethodInfoAsMessageAdvice : IMethodBeforeAdvice
{
    public void Before(MethodInfo method, object[] args, object target)
    {
        //Do something
    }
}

public class SetMethodInfoAsMessageAttribute : Attribute
{
}    

使用以下配置:

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net"
         xmlns:aop="http://www.springframework.net/aop" >

  <!-- Controllers -->
  <object type="MyApp.Controllers.HomeController, MyApp" singleton="false" />

  <!-- Aop -->
  <object id="myInterceptor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
    <property name="Attribute" value="MyApp.Controllers.SetMethodInfoAsMessageAttribute, MyApp" />
    <property name="Advice">
      <object type="MyApp.Controllers.SetMethodInfoAsMessageAdvice, MyApp" />
    </property>
  </object>

  <object type="Spring.Aop.Framework.AutoProxy.InheritanceBasedAopConfigurer, Spring.Aop">
    <property name="ObjectNames">
      <list>
        <value>*Controller*</value>
      </list>
    </property>
    <property name="InterceptorNames">
      <list>
        <value>myInterceptor</value>
      </list>
    </property>
  </object>
</objects>

【问题讨论】:

    标签: c# asp.net-mvc inheritance aop spring.net


    【解决方案1】:

    找到了。显然,InheritanceBasedAopConfigurer 中有一个属性调用 ProxyDeclaredMembersOnly 可以启用此行为。最终的 Config 如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <objects xmlns="http://www.springframework.net"
             xmlns:aop="http://www.springframework.net/aop" >
    
      <!-- Controllers -->
      <object type="MyApp.Controllers.HomeController, MyApp" singleton="false" />
    
      <!-- Aop -->
      <object id="myInterceptor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
        <property name="Attribute" value="MyApp.Controllers.SetMethodInfoAsMessageAttribute, MyApp" />
        <property name="Advice">
          <object type="MyApp.Controllers.SetMethodInfoAsMessageAdvice, MyApp" />
        </property>
      </object>
    
      <object type="Spring.Aop.Framework.AutoProxy.InheritanceBasedAopConfigurer, Spring.Aop">
        <property name="ProxyDeclaredMembersOnly" value="false" />
        <property name="ObjectNames">
          <list>
            <value>*Controller*</value>
          </list>
        </property>
        <property name="InterceptorNames">
          <list>
            <value>myInterceptor</value>
          </list>
        </property>
      </object>
    </objects>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 2022-09-28
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多