Spring.Net 方面是否可能不适用于 Asp.Net Controller ?

我想在 Controller 的 Action 方法上配置事务,但代理似乎没有触发。

<object id="ControllerClassPointcut" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
  <property name="patterns">
    <list>
      <value>xxx.Controllers.CompanyController.*</value>
    </list>
  </property>
</object>

<aop:config>
  <aop:advisor pointcut-ref="ControllerClassPointcut" advice-ref="TxAdvice"/>
  <!-- TxAdvice taken from ServiceContext -->
</aop:config>

<tx:advice id="TxAdvice" transaction-manager="TransactionManager">
  <tx:attributes>
    <tx:method name="*" propagation="Required"/>
  </tx:attributes>
</tx:advice>

而 CompanyController 的 action 方法是:
    [HttpPost]
    public virtual ActionResult Create(Guid id, CompanyonViewModel vm)
    {
       ...
    }

但是我的建议没有生效,尽管切入点被识别。如果我将 Controller 以外的其他类作为切入点,则它可以工作。

对于某些方法,建议有效。例如,对于存储库的 setter。但是 Sprint.Net 不承认调用了 action 方法“Create”



谢谢你的帮助

最佳答案

我对 [Transaction] 属性(它使用 Spring.AOP 起作用)有类似的问题。
在我的例子中,我从同一个类中调用了 [Transaction] 标记的方法,并且对事务建议没有触发感到惊讶。

解释是,当从类中调用 [Transaction] 标记的方法时,您持有对真实实例的引用,而不是 AOP 代理的实例,因此调用不会被拦截。

当向 MVC 应用程序发出请求时,会从请求 url 中选择一个 Controller (来自 IControllerFactory 实例)。在此 Controller 上调用 Execute 方法,该方法又负责调用操作。所以我认为 Action 方法总是从 Controller 内部调用。这意味着根据定义,操作方法永远不会被拦截。这将解释为什么这些切入点被识别,但不触发。



它还解释了为什么除 Controller 之外的其他类上的切入点会触发:它们很可能是从 Controller 调用的, Controller 将保存对其他类的实例的 AOP 代理引用。



我假设您的(例如) CompanyController.CustomerController 有一个属性 CustomerRepository ,使用 DI 设置。这个切入点触发是有道理的,因为 setter 是从 CompanyController.CustomerController 外部调用的,例如由您的 DI 容器(或您的 ControllerFactory )调用。

一个解决方案可能是引入服务对象,您可以在其上定义您现在在 Controller 上拥有的事务建议。从你的 Controller ,你调用这些服务对象的方法——然后切入点将被触发。

关于asp.net-mvc - Asp.Net MVC Controller : declarative AOP with Spring. Net,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4280143/

10-11 22:28
查看更多