Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как установить рекомендацию Spring.NET AOP перед вызовом метода

Автор вопроса: rtorresОтветов: 1

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

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

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

1.Создал совет:

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

2. Обновлены мои конфигурации spring 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>

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

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

aop

Ответы

Ответ 1 · рейтинг 1 · Marijn

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

public virtual void Handle()  // ...

В вашем классе не реализованы какие-либо интерфейсы, которые используются в механизме aop по умолчанию Spring.net использует для создания прокси. Когда spring.net не находит никаких интерфейсов для прокси, он ищет виртуальные методы чтобы создать прокси для класса.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы