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/