2011-07-06 2 views
2

나는 시작하기 전에, 나는 다음과 같은 AOP 용어의 나의 현재 이해는 것을 명확히하고 싶습니다 ...PostSharp 포인트 컷

  • 측면은 OOP의 클래스의 AOP에 해당합니다.
  • 조언은 OOP의 메소드와 동일한 AOP입니다.
  • Pointcut은 OOP에서 'using'코드와 동일한 AOP입니다. OOP에서 우리는 사물을 호출한다. AOP에서 우리는 물건을 짠다. 의 결정 무엇 직조 어디는 Pointcuts에 의해 정의됩니다. 실제 질문 상에,

...

이 나는 ​​특성을 제외한 모든 방법에 (직물)를 사용하려는 PostSharp에서 로깅 측면이있다. 원래 내 측면에 다음을 사용 하였다 그러나

[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)] 

, 나는 특성에 실행에서 내 코드를 배제하기 위해 런타임에 차 검사를 수행했다 의미하는 측면이 여전히 속성으로 짠되고 있었다 발견 :

if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) { 

이상적인 것은 아닙니다. 내 포인트 컷에서이 동작을 정의하여 런타임 검사를 수행 할 필요가 없어야합니다.

빌드 시간에 조언을 위해 위버를 선택하는 데 도움이되는 콜백을 제공하는 것처럼 보이는 MethodPointcut 속성을 조사했습니다. 예제를 볼 수 있습니까?

여전히 작동한다고 가정 할 때, 필자는 '왜 포인트 컷을 내 어드바이스에 하드 코드해야합니까?'라고 생각하고 있습니다. 측면 및 조언은 정의/구현입니다. Pointcuts가 사용법입니다. 둘은 분리되어야합니다.

답변

3

속성 방법은 정확해야하는 두 가지 방법입니다. PostSharp는 MSBuild가 C#을 MSIL로 변환 한 후에 작동합니다.

당신이하는 일은 런타임에 체크하는 것이 아니라 컴파일 타임에 체크하는 것입니다. CompiletimeValidate() 메소드를 덮어 쓰고 거기에 체크 코드를 옮깁니다. 메서드가 일치하면 false를 반환하고 그렇지 않으면 true를 반환합니다. PostSharp는이 메소드를 사용하여 애스펙트가 타겟에 적용되는지를 컴파일 타임에 결정합니다. 런타임에 아무 것도 일어나지 않아야합니다.

멀티 캐스팅을 사용하여이를 수행 할 수도 있습니다. (약간 다른 사람과 함께) 그 http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx

[assembly: MyAspect(AspectPriority = 10)] 
[assembly: MyAspect(AspectPriority = 0, 
    AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")] 

MethodPointcut에 detials에 대해 다음 PostSharp 교장 문서를 참조하십시오 복잡한 측면위한 것입니다. 다음 주에 관한 기사가 나옵니다.

+0

감사합니다. 그렇다면 MulticastTargets.Property는 무엇을 식별합니까? –

+0

메서드 = 메서드는 있지만 생성자는 아니고, 속성 = 속성이지만 메서드는 아닙니다. http://doc.sharpcrafters.com/postsharp/2.0/##PostSharp.chm/html/T_PostSharp_Extensibility_MulticastTargets.htm –

관련 문제