2017-02-24 15 views
0

私は最近、私たちのプロジェクトの1つとしてPostSharpを使用し始めました。特定のメソッド(特定の機能を表す)内で呼び出されているすべてのメソッドのログメソッドの実行時間は、です。特定のメソッド内で呼び出されたすべてのメソッドに対してPostSharpを有効にするにはどうすればよいですか?

私が今まで行ってきたのは、(TimingAspectと言う)アスペクトを作成し、(TimingAspectをメソッド定義の上に書くことで)1つのメソッドでテストしたことです。そのメソッドの実行時間を別のログファイルに記録しても問題ありません。

私の知るところでは、メソッド定義の上に '[TimingAspect]'を書くと、そのメソッドだけが記録され、このメソッドから呼び出される他のメソッドは記録されません。私は正しい?だから私は可能な方法がある場合は、具体的なメソッド内で呼び出されているすべてのメソッドのログメソッドの実行時間を達成すると思っています

答えて

0

IAspectProviderを実装することによって、ターゲットメソッドから呼び出されたメソッドにアスペクトを適用できます。呼び出されたメソッドをすべて見つけるには、PostSharp APIのReflectionSearchクラスを使用できます。

以下にそのようなアスペクトプロバイダの例を示します。

[PSerializable] 
public class TimingAspectProvider : MethodLevelAspect, IAspectProvider 
{ 
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     MethodBase targetMethod = (MethodBase) targetElement; 

     IAspectRepositoryService aspectRepositoryService = PostSharpEnvironment.CurrentProject.GetService<IAspectRepositoryService>(); 
     TimingAspect aspect = new TimingAspect(); 

     MethodUsageCodeReference[] usages = ReflectionSearch.GetDeclarationsUsedByMethod(targetMethod); 
     foreach (MethodUsageCodeReference codeReference in usages.Where(u => u.UsedDeclaration.MemberType == MemberTypes.Method)) 
     { 
      if (!aspectRepositoryService.HasAspect(codeReference.UsedDeclaration, typeof(TimingAspect))) 
      { 
       yield return new AspectInstance(codeReference.UsedDeclaration, aspect); 
      } 
     } 
    } 
} 

これは、呼び出されたメソッドなどから呼び出されるメソッドのログ記録には適用されません。私の理解では、ターゲットメソッドから直接呼び出されるメソッドをログに記録したいということです。

関連する問題