2010-11-25 8 views
3

Est-il possible que les aspects Spring.Net ne fonctionnent pas avec le contrôleur Asp.Net?Contrôleur Asp.Net MVC: AOP déclaratif avec Spring.Net

Je souhaite configurer des transactions sur les méthodes Action des contrôleurs, mais le proxy ne semble pas déclencher.

<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> 

et la méthode d'action du CompanyController est:

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

mais je le conseil ne prend pas effet bien est reconnu pointcut. Si je prends une autre classe qu'un contrôleur comme pointcut cela fonctionne.

Pour certaines méthodes, le conseil fonctionne. Par exemple pour le setter pour le référentiel. Mais Sprint.Net ne reconnaît pas que la méthode d'action "Create" est appelée

Le candidat est: 'xxx.Controllers.CompanyController.set_CompanyService'; Le modèle est 'xxx.Controllers.CompanyController.'; matched = True Conseiller candidat [DefaultObjectFactoryPointcutAdvisor: pointcut [Spring.Aop.Support.SdkRegularExpressionMethodPointcut]; conseils objet = 'TxAdvice'] accepté pour targetType [xxx.Controllers.CompanyController]

Merci pour votre aide

+0

En relation: http://stackoverflow.com/questions/9114762/unobtrusive-aop-with-spring-net/9115510 – Marijn

Répondre

2

J'ai eu un problème similaire avec l'attribut [Transaction] (qui fonctionne à l'aide Spring.AOP). Dans mon cas, j'ai appelé les méthodes marquées [Transaction] à partir de la même classe et j'ai été surpris que le conseil de transaction n'a pas été déclenché. L'explication était que lorsque vous appelez une méthode marquée [Transaction] à partir de la classe, vous détenez une référence à l'instance réelle au lieu de l'instance AOP-proxy, donc l'appel n'est pas intercepté.

Lorsqu'une requête est envoyée à une application MVC, un contrôleur est sélectionné dans l'url de la requête (à partir de l'instance IControllerFactory). Sur ce contrôleur, la méthode Execute est appelée, qui à son tour est responsable de l'appel des actions. Donc je pense que les méthodes d'action sont toujours appelées depuis le contrôleur. Ce qui signifie que par définition les méthodes d'action ne seront jamais interceptées. Cela expliquerait pourquoi ces points sont reconnus, mais ne tirent pas.

si je prends une autre classe qu'un contrôleur comme pointcut cela fonctionne

Il explique aussi pourquoi pointcuts sur d'autres classes que les contrôleurs font le feu: ils sont probablement appelés à partir d'un contrôleur, qui tiendra une référence AOP-proxy aux instances des autres classes.

... pour quelques méthodes les conseils fonctionne ... Par exemple, pour le poseur pour le dépôt

Je suppose que votre (par exemple) CompanyController.CustomerController a une propriété CustomerRepository, définies à l'aide DI . Il est logique que ce pointcut se déclenche, car le setter est appelé depuis l'extérieur du CompanyController.CustomerController, par exemple par votre conteneur DI (ou votre ControllerFactory).

Une solution pourrait être d'introduire des objets de service, sur lesquels vous définissez le conseil de transaction que vous avez maintenant sur vos contrôleurs. À partir de vos contrôleurs, vous appelez des méthodes sur ces objets de service, puis les points de coupure se déclenchent.

+0

ce sujet est également discuté sur le [forum Java Spring] (http: //forum.springsource. org/showthread.php? t = 46814) – Marijn

+0

mais je ne suis pas sûr si je conseillerais de suivre la solution que l'utilisateur "gspeed" affiche à la fin; mieux suivre les conseils de Mike – Marijn

4

Pouvez-vous essayer avec la configuration

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

Cela va créer un héritage proxy basé. il se peut que vous deviez télécharger une version nocturne récente de spirng.net pour que cela fonctionne (pas 1.3.0).

+0

Mark, pourriez-vous poster un commentaire rapide à ma réponse plus tôt aujourd'hui? J'apprécierais tout commentaire. – Marijn

+0

Je ne suis pas fan des builds nocturnes, donc je n'utiliserai pas cette solution. mais merci pour la réponse – Fabiano

+1

Selon les [docs] (http://www.springframework.net/doc-latest/reference/html/transaction.html#tx-annotation-driven-settings) vous pouvez également mettre cela dans le Paramètres d'annotation tx. – Marijn

Questions connexes