2010-11-25 32 views
3

Spring.Net方面可能不適用於Asp.Net控制器嗎?Asp.Net MVC控制器:Spring.Net的聲明式AOP

我想在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的操作方法是:

[HttpPost] 
    public virtual ActionResult Create(Guid id, CompanyonViewModel vm) 
    { 
     ... 
    } 

但我雖然切入點是公認的建議不會生效。如果我選擇另一個班級而不是控制器作爲切入點,它就可以工作。

對於某些方法的建議起作用。例如,用於存儲庫的setter。但Sprint.Net不認識到操作方法「創建」被稱爲

候選人是:'xxx.Controllers.CompanyController.set_CompanyService';模式是'xxx.Controllers.CompanyController。*'; matched = True 候選顧問[DefaultObjectFactoryPointcutAdvisor:pointcut [Spring.Aop.Support.SdkRegularExpressionMethodPointcut];諮詢對象= 'TxAdvice']接受TARGETTYPE [xxx.Controllers.CompanyController]

感謝您的幫助

+0

相關:http://stackoverflow.com/questions/9114762/unobtrusive-aop-with-spring-net/9115510 – Marijn 2012-02-03 13:32:57

回答

2

我曾與[Transaction]屬性類似的問題(工作使用Spring.AOP)。 就我而言,我打電話給[Transaction]來自同一班級的標記方法,並對交易建議未觸發感到驚訝。

解釋是,當在類中調用[Transaction]標記的方法時,您持有對實際實例的引用,而不是AOP代理的實例,因此調用不會被攔截。

當向MVC應用程序發出請求時,則從請求url中選擇一個控制器(來自IControllerFactory實例)。在此控制器上,將調用Execute方法,該方法負責調用操作。所以我認爲的操作方法總是從控制器中調用。這意味着根據定義,動作方法將永遠不會被攔截。這可以解釋爲什麼這些切入點被識別,但不會觸發。

如果我採取其他類比 控制器作爲切入點它的工作原理

這也解釋了爲什麼在其他類比控制器切入點做火了:他們有可能從控制器調用,將舉行一個AOP代理引用其他類的實例。

...一些方法建議工作...例如,對於引領者 庫

我認爲你(例如)CompanyController.CustomerController有一個屬性CustomerRepository,使用DI設置。這個切入點是有意義的,因爲二傳手從CompanyController.CustomerController以外被調用,例如通過你的DI容器(或者你的ControllerFactory)。

解決方案可能是引入服務對象,您可以在其上定義您現在在控制器上的交易建議。從您的控制器中,您可以調用這些服務對象的方法 - 然後切入點將會觸發。

+0

本主題也在[Java Spring論壇](http://forum.springsource)上討論。 org/showthread.php?t = 46814) – Marijn 2010-12-03 15:11:20

+0

但我不知道我是否會建議遵循最終用戶「gspeed」發佈的解決方案; Mark更好地遵循Mike的建議 – Marijn 2010-12-03 15:12:44

4

你可以嘗試用配置

<aop:config proxy-target-type="true"> 

這將創建一個基於繼承的代理。你可能需要下載最近一次的spirng.net構建版本才能運行(不是1.3.0)。