0

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>

何らかの理由で、ブレークポイントを配置すると、アドバイス コードがヒットしません。ただし、アドバイスにコンソール ログ ステートメントを追加すると、それらはログに記録されているように見えますが、適切なタイミング (つまり、Listener.Handle() を呼び出す前) ではありません。

私の設定が間違っていることに賭けても構わないと思っています(一度だけ、リスナーが持つ可能性のある他のメソッドではなく、Handle メソッド呼び出しだけをリッスンするように設定に指示する方法が欠けている可能性があります)。何が問題なのですか?

4

1 に答える 1

1

Handleメソッドを仮想として宣言します。

public virtual void Handle()  // ...

クラスは、spring.net のデフォルトの aop メカニズムがプロキシを作成するために使用するインターフェースを実装していません。spring.net がプロキシへのインターフェースを見つけられない場合、クラスのプロキシを作成するための仮想メソッドを探します。

于 2013-09-21T15:15:19.840 に答える