2009-09-13 4 views
0

저는 PostSharp를 사용하여 CompoundAspect를 (CastleProject의) ActiveRecord 클래스에 적용하려고합니다. 코드는 다음과 같습니다PostSharp : OnMethodBoundaryAspect가 호출되지 않습니다.

public override void ProvideAspects(object targetElement, LaosReflectionAspectCollection collection) 
{ 
    Type targetType = (Type)targetElement; 
    RevertibleSubAspect revertible = new RevertibleSubAspect(); 
    revertible.Cascade = this.Cascade; 
    collection.AddAspect(targetType, revertible); 

    //This isn't working 
    MethodInfo saveMethod = targetType.GetMethod("Save"); 
    collection.AddAspect(saveMethod, new CommitOnSaveSubAspect()); 

    foreach (PropertyInfo property in targetType.GetProperties()) 
    { 
     if((this.Only != null && this.Only.IndexOf(property.Name) == -1) || 
      (this.Except != null && this.Except.IndexOf(property.Name) > -1)) 
     { 
      continue; 
     } 

     if (property.DeclaringType == targetType && property.CanWrite) 
     { 
      MethodInfo method = property.GetSetMethod(); 
      if (method != null && !method.IsStatic) 
      { 
       collection.AddAspect(method, new TrackInitialPropertyValuesSubAspect()); 
      } 
     } 
    } 
} 

모든 것은 OnMethodBoundaryAspect 인 CommitOnSaveSubAspect 제외하고 잘 작동합니다. OnSuccess 메서드는 Save 메서드가 호출 될 때 호출되지 않습니다. OnEntry와 OnExit로 코드를 옮겨 보았습니다 만, 여기서도 같은 상황입니다.

CommitOnSaveSubAspect 클래스는 다음과 같습니다

[Serializable] 
class CommitOnSaveSubAspect : OnMethodBoundaryAspect 
{ 
    public override void OnSuccess(MethodExecutionEventArgs eventArgs) 
    { 
     ((IRevertible)eventArgs.Instance).Commit(); 
    } 
} 

오전 내가 잘못된 방향으로 화면을 적용?

+0

@Mato을! 그냥 그 method.IsStatic 및 조건의 경우 다른 확인. 이 조건문에 의해 양상이 지정되었거나 되돌려지지 않았습니까? –

+0

그냥 왜 NHibernate/ActiveRecord의 정기적 인 차단 메커니즘을 사용하지 않습니까? (OnSave() 또는 FindDirty(), IInterceptor, 이벤트 리스너 무시) –

+0

@David Andres : CommitOnSaveSubAspect는 foreach 루프 외부에 적용되므로 조건문은이 설정에 영향을주지 않습니다. @Mauricio Scheffer : 코드 재사용 성이 이렇게 좋기 때문에 코드를 여러 클래스에 보급하고 싶지 않습니다. 이 일을하지 않는 또 다른 이유는 내 의견으로는 이것이 프로퍼티 AOP가되지 않는다는 것입니다. – Mato

답변

0

PostSharp를 설치했을 때 전역으로 정의 되었습니까? 그렇지 않으면 PostSharp가 어셈블리에 제대로 주입되도록 프로젝트 파일을 편집해야합니다.

http://doc.postsharp.org/1.0/Default.aspx##PostSharp.HxS/UserGuide/Platform/EnablingPostSharp.html을 참조하십시오.

+0

PostSharp는 내가 설치할 때 전역 적으로 정의되었습니다. 전역 적으로 정의되지 않았다면 위의 코드 중 아무 것도 작동하지 않습니다. 하지만 CommitOnSaveSubAspect 만 작동하지 않습니다. – Mato

2

애스펙트를 디버깅하는 좋은 방법은 리플렉터를 사용하여 결과 어셈블리를 보는 것입니다. 예상대로 메소드가 향상 되었습니까?

은 또한 다음 명령 줄은 MSBuild를 그것으로 중단 점을 넣고 실행하여 ProvideAspects 방법을 디버깅 할 수 있습니다 :

msbuild /p:PostSharpAttachDebugger=true 
+0

좋아요, 메서드가 예상대로 향상되지 않은 것 같습니다 (전혀 변경되지 않습니다). 그러나 디버거에서는 getMethod ("Save")가 메서드를 찾고 올바른 MethodInfo를 반환한다는 것을 보여줍니다. 문제가 가상의 방법 일 수 있습니까? 클래스의 mthod를 넘을 때 메서드에 특성을 적용 할 때 예상대로 향상됩니다. – Mato

+0

가상 메서드에 애스펙트를 추가하면 애스펙트로 애노테이션을 추가 한 정확한 메서드에 애스펙트가 적용됩니다. 재정의에도 적용되는 측면에 대한 자세한 내용은 http://doc.postsharp.org/1.5/##PostSharp.HxS/UserGuide/Laos/Multicasting/Inheritance.html을 참조하십시오. –

관련 문제