2013-09-20 3 views
0

Я хочу перехватить вызов метода перед выполнением с помощью Spring.NET. Давайте предположим, что класс/метод перехвата является:Как установить совет Spring AOP перед вызовом метода

public class Listener 
{ 
    public void Handle() 
    { 
     // method body 
    } 
} 

Это то, что я сделал (предполагая, что весь код находится в пространстве имен, например):

1.Created совет:

public class MyAopAdvice : IMethodBeforeAdvice 
{ 
    public void Before(MethodInfo method, object[] args, object target) 
    { 
     // Advice action 
    } 
} 

2.Updated моей весна XML конфига:

<object id="myAopAdvice" type="Example.MyAopAdvice" /> 

    <object id="listener" type="Spring.Aop.Framework.ProxyFactoryObject"> 
    <property name="Target"> 
     <object type="Example.Listener" autowire="autodetect"/> 
    </property> 
    <property name="InterceptorNames"> 
     <list> 
     <value>myAopAdvice</value> 
     </list> 
    </property> 
    </object> 

По какой-то причине моего совета код не получает удар I Я поставил в нем точку останова. Тем не менее, если я добавлю некоторые инструкции ведения журнала консоли в свой совет, кажется, что они заносятся в журнал, но не в соответствующее время (т. Е. Перед вызовом Listener.Handle()).

Я готов поспорить, что мои конфиги ошибочны (на этот раз мне может не хватало способа сказать, чтобы конфиги прослушивали только вызов метода Handle, а не какой-либо другой метод, который может быть у слушателя). Какие-нибудь идеи, что не так?

ответ

1

объявить метод Handle как виртуальные:

public virtual void Handle() // ... 

Ваш класс не реализует никаких интерфейсов, которые spring.net-х механизм uses to create proxies АОП по умолчанию. Когда Spring.net не находит никаких интерфейсов для прокси, он ищет виртуальные методы to create a proxy for a class.

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