Это связано с тем фактом, что контроллер создан и затем сам вызывает DoStuff()
для него. Контроллер, очевидно, не держит прокси для себя и, следовательно, вызов DoStuff()
не перехватывается Spring.Net AOP.
Как Тобсен упоминает в своем ответе, вам придется взять контроллер с весны, иначе перехват не состоится. Я предполагаю, что вы используете здесь поддержку Spring mvc для создания контроллеров, но это не ясно из вашего вопроса, и вы, возможно, оставили его.
Как перехватить методы действия на контроллерах MVC 3
Резюме
Подробности и пример приведены ниже.
- Используйте
InheritanceBasedAopConfigurer
- Объявите методы, которые вы хотите перехватить, как виртуальные
- Настройте перехватчики
Механизм перехвата по умолчанию Spring не работает ...
Когда в приложение MVC делается запрос, то из URL-адреса запроса контроллер MVC выбирает контроллер. На этом контроллере вызывается метод Execute()
, который, в свою очередь, отвечает за вызов методов действия. Важно понимать, что методы действия всегда вызываются из контроллера .
Spring.NET AOP использует динамическое переплетение. По умолчанию во время выполнения прокси создается для объектов, для которых в конфигурации объявлены aop советники. Этот прокси перехватывает вызовы и перенаправляет вызовы целевому экземпляру. Это делается при проксировании интерфейсов и классов (используя proxy-target-type="true"
) . Когда целевой объект сам вызывает метод, он не будет делать это через прокси-пружину, а метод не перехватывается . Вот почему механизм aop по умолчанию не работает для контроллеров mvc.
... но использование InheritanceBasedAopConfigurer
делает трюк
Для перехвата вызовов методов действия вы должны использовать InheritanceBasedAopConfigurer
. Это создаст прокси на основе наследования, которое не делегирует целевому объекту, вместо этого рекомендация по перехвату добавляется непосредственно в тело метода перед вызовом метода базового класса.
Обратите внимание, что для работы этого метода перехвата методы должны быть виртуальными.
Работает следующая конфигурация xml:
<!--
When not specifying an object id or name,
spring will assign a name to it like [typename]#[0,1,2,..]
-->
<object type="MyApp.Controllers.HomeController, MyApp"
singleton="false" />
<object id="myInterceptor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
<property name="Attribute" value="MyApp.MyAttribute, MyApp" />
<property name="Advice">
<object type="MyApp.MyAdvice, MyApp" />
</property>
</object>
<object type="Spring.Aop.Framework.AutoProxy.InheritanceBasedAopConfigurer, Spring.Aop">
<property name="ObjectNames">
<list>
<value>*Controller#*</value>
</list>
</property>
<property name="InterceptorNames">
<list>
<value>myInterceptor</value>
</list>
</property>
</object>
Рабочий пример доступен на github . Он основан на стандартном приложении mvc 3 с поддержкой Spring.Net Mvc3 . Соответствующие файлы:
Ссылки