2017-02-24 27 views
0

최근에 우리 프로젝트 중 하나에 PostSharp를 사용하기 시작했습니다. 목표는 특정 메소드 (특정 기능을 나타내는) 내에서 호출되는 모든 메소드에 대한 로그 메소드 실행 시간입니다. 입니다.특정 방법으로 호출 된 모든 메소드에 대해 PostSharp를 사용하려면 어떻게해야합니까?

내가 지금까지 한 것은 애스펙트 (TimingAspect)를 만들고 ('TimingAspect'를 메소드 정의 위에 작성하여) 한 가지 방법으로 테스트했다는 것입니다. 그것은 잘 작동, 별도의 로그 파일에 그 방법에 대한 실행 시간을 기록.

필자가 알고있는 것처럼, 메소드 정의 위에 '[TimingAspect]'를 쓰면이 메소드에서만 기록되고 다른 메소드는이 메소드에서 호출되지 않습니다. 내가 맞습니까? 그래서 지금 내가 할 수있는 방법이 있는지 궁금 하네 , 즉 특정 메소드 내에서 호출되는 모든 메소드의 로그 메소드 실행 시간을 달성했다면?

답변

0

IAspectProvider을 구현하여 대상 메서드에서 호출 한 메서드에 애스펙트를 적용 할 수 있습니다. 호출 된 모든 메소드를 찾으려면 PostSharp API의 ReflectionSearch 클래스를 사용할 수 있습니다.

아래에서 그러한 aspect 제공자의 예를 찾을 수 있습니다.

[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); 
      } 
     } 
    } 
} 

호출 된 메소드 등에서 호출 된 메소드에 대한 로깅은 다루지 않습니다. 내 이해는 대상 메서드에서 직접 호출되는 메서드를 기록하려고합니다.