2010-11-25 3 views
3

Возможно ли, что Spring.Net Аспекты не работают с Asp.Net Controller?Asp.Net MVC Controller: декларативный АОП с Spring.Net

Я хочу сконфигурировать транзакции по методам действий контроллеров, но прокси-сервер не запускается.

<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) 
    { 
     ... 
    } 

но совет не вступает в силу, хотя признаются срез точек. Если я возьму другой класс, чем контроллер, как pointcut, он будет работать.

для некоторых методов совет работает. Например, для установщика для репозитория. Но Sprint.Net не признает, что метод действия «Создать» называется

кандидат является: «xxx.Controllers.CompanyController.set_CompanyService»; pattern is '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

ответ

2

У меня была аналогичная проблема с атрибутом [Transaction] (который работает с использованием Spring.AOP). В моем случае я назвал методы с флагом [Transaction] из одного класса и был удивлен тем, что рекомендации по сделке не срабатывали.

Объяснение состояло в том, что при вызове помеченного методу [Transaction] из класса вы указываете ссылку на реальный экземпляр вместо экземпляра AOP-прокси, поэтому вызов не перехватывается.

Когда запрос сделан в приложение MVC, то из URL-адреса запроса выбирается контроллер (из экземпляра IControllerFactory). На этом контроллере вызывается метод Execute, который, в свою очередь, отвечает за вызов действий. Поэтому я считаю, что методы всегда вызываются из контроллера. Это означает, что по определению методы действий никогда не будут перехвачены. Это объясняет, почему эти pointcuts распознаются, но не срабатывают.

если взять другой класс, чем контроллера, как срез точек работает

Это также объясняет, почему срезы в на других классах, чем контроллеры делают огнь: они, вероятно, вызывается из контроллера, который будет держать AOP-прокси-ссылка на экземпляры других классов.

... для некоторых методов совет работает ... К примеру для сеттера для хранилище

Я предполагаю, что ваш (например) CompanyController.CustomerController имеет свойство CustomerRepository, устанавливается с помощью DI , Имеет смысл, что этот pointcut срабатывает, потому что сеттер вызывается извне CompanyController.CustomerController, например, вашим контейнером DI (или вашим ControllerFactory).

Решение может заключаться в представлении объектов обслуживания, на которых вы определяете совет по транзакциям, который у вас есть на ваших контроллерах. С ваших контроллеров вы вызываете методы на этих объектах обслуживания, а затем стрелки точек срабатывают.

+0

Этот раздел также обсуждается на [форуме Java Spring] (http: //forum.springsource. org/showthread.php? t = 46814) – Marijn

+0

, но я не уверен, буду ли я советовать следовать решению, которое пользователь «gspeed» размещает в конце; лучше следуйте совету Майка – Marijn

4

Вы можете попробовать с конфигурацией

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

Это создаст прокси на основе наследования. вам может потребоваться загрузить недавнюю ночную сборку spirng.net, чтобы это работало (а не 1.3.0).

+0

Марк, не могли бы вы быстро высказать свой ответ из моего сегодняшнего ответа? Буду признателен за любые отзывы. – Marijn

+0

Я не поклонник ночных сборщиков, поэтому я не буду использовать это решение. но спасибо за ответ – Fabiano

+1

В соответствии с [docs] (http://www.springframework.net/doc-latest/reference/html/transaction.html#tx-annotation-driven-settings) вы также можете поместить это в tx аннотации. – Marijn

Смежные вопросы