0

Postsharp を使用して、既存のアプリケーションに AOP を実装しようとしています。

既存のアプリケーションのメソッドは、入口と出口で特定の呼び出しを行います

class Test
{
Method1()
{
Log.Start()
//code
Log.Stop()
}

Method2
{
Log.Start()
//code
Log.Stop()
}
}

ここで、LogAspect を含むアスペクトを宣言するとします。

  public override void OnEntry(MethodExecutionArgs args) 
    {
       Log.Start();
     }
     public override void OnExit(MethodExecutionArgs args) 
    {
       Log.Stop();
     }

今、私はこの側面をテストクラスに使いたいと思っています

だから私はこれをします。

[LogAspect()]
class Test
{
method1()
{
}

method2()
{
}
}

これで、LogAspect がすべてのテスト メソッドに適用されます。

しかし、 Log.Start() 、 Log.Stop() は既に method1 と method2 に存在するため、2 回実行されます。LogAspect が method1 と method2 で Log.Start() と Log.Stop() を抑制し、入口と出口で独自の機能を単独で実行する方法はありますか。私はAOPに慣れていないので、他のソリューションではない場合、Postsharpでこれは可能ですか? ここでの核心は、既存のアプリケーションをアスペクトに変更するために必要な最小限の変更です。

4

1 に答える 1

1

現在、PostSharp 自体はコードを変更して、既存のLog.Start()andLog.Stop()メソッドの呼び出しを削除することはできません。

リファクタリングを適用し、既存のログ記録方法を変更して、ログ記録を実行しないようにする簡単な解決策を提案する場合があります (おそらく条件に基づく)。そして、アスペクト内で、実際のロギングを実行する他の新しいロギング メソッドを呼び出します。

public override void OnEntry(MethodExecutionArgs args) 
{
    Log.NewStart();
}

public override void OnExit(MethodExecutionArgs args) 
{
    Log.NewStop();
}

より高度なソリューションが必要な場合は、古いロギング メソッドの状態LogAspectで、現在のメソッドに適用されているかどうかを確認し、その場合にのみロギングをスキップできます。しかし、これを実装するのは非常に困難であり、AOP を追加するための最小限の労力という要件ではおそらく報われないでしょう。

于 2013-09-17T17:31:06.873 に答える