1) PostSharp Aspect Lifetime

·         PostSharp 핵심은 바로 Post-Compiler입니다. Post-Compiler 컴파일이 이후의 어셈블리를 수정하는 것을 의미합니다.

 

http://www.codeproject.com/KB/cs/ps-custom-attributes-2.aspx


·         PostSharp에서 Aspect 컴파일 타임에 생성(PostSharp Laos 의해서) 됩니다. 또한 런타임에 수정된 어셈블리를 로드하여 사용하는 복잡한(?!) Aspect Lifetime 가지고 있습니다. 이러한 과정을 자세히 알아보겠습니다.

 

·          컴파일 타임 (숫자는 실질적인 시간의 순서를 나타냅니다.)

1. Aspect 인스턴스화 : 해당 Aspect 적용될 모든 클래스(Target) Aspect 적용할 있는 코드를 만듭니다.

2. 컴파일 타임 초기화 : Aspect 인스턴스 안에 타입, 필드, 메소드를 있도록 초기화 해줍니다. 여기서 초기화 하는 타입, 필드, 메소드는 런타임에서도 사용할 있습니다.

3. 직렬화 : 새롭게 만들어진 어셈블리 리소스에 저장시키기 위해 직렬화해줍니다.

 

·          런타임

4. 1. 역직렬화 : Aspect 처음으로 사용하는 시점에 어셈블리 리소스에 저장된 정보들을 역직렬화합니다.

4. 2. 런타임 초기화 : 타입, 필드, 메소드의 속성을 초기화합니다. 여기서는 역직렬화된 필드를 사용하여 역직렬화된 타입, 필드, 메소드를 저장합니다. (다시 말해서 런타임에서는 직렬화된 정보를 역직렬화 하기 때문에 초기화 메서드에서 역직렬화된 필드를 사용하여야 컴파일 타임에 직렬화되었던 정보를 사용할 있는 것입니다.)

5. 인터셉트 메소드 호출 : Aspect 종류에 따라서 Aspect 실행되어야 시점을 인터셉트해서 호출합니다.

 

 

2) Aspect Kind

종류

내용

인터셉트 메소드

비고

On Method Boundary

메소드의 안에서 일어날 수 있는 시작점과 종료점 등과 같은 인터셉트 메소드를 제공해줌으로써 해당 시점을 인터셉트해 줄 수 있습니다. Trace 트랜잭션를 사용할 경우에 유용합니다.

OnEntry, OnSuccess, OnException, OnExit

 

On Exception

예외가 발생하는 경우에 처리해야 할 내용을 Aspect 만들 경우에 사용합니다.

OnException

 

On Field Access

모든 필드에 대한 인터셉트를 제공해줍니다.

OnGetValue, SetValue

 

On Method Invocation

On Method Boundary와 비슷합니다. 차이점은 다른 어셈블리에 있는 메소드도 인터셉트 할 수 있습니다.

OnInvocation

 

Composition

많은 Sub-Aspect 복합적으로 사용할 경우에 유용합니다.

클래스(Type)에 인터페이스를 구현해줍니다.

GetPublicInterface

CreateImplementationObject

 

Compound

많은 Sub Aspect를 복합적으로 사용할 경우에 유용합니다.

ProvideAspects

 

Implement Method

abstract or extern 메소드를 인터셉트 해줍니다.

OnExecution

 

Custom Attribute Injector

타켓에 속성  어트리뷰트를  추가할 경우에 사용합니다.

 

 

 

3) PostSharp + Enterprise Library(이하 EL)

·         EL에서도 AOP의 기능을 하는 Policy Injection Application Block(이하 PIAB)이 있습니다. PIAB는 런타임 위빙방식으로 설정파일에 의해서 Policy(정책)에 의해서 다른 Application Block를 사용합니다. PIAB MarshalByRefObject를 상속받는 개체를 요구하거나 인터페이스를 상속받는 개체를 요구합니다. (실제로 PIAB 예제를 사용해봤을 경우에는 MarshalByRefObject를 상속받지 않고서도 실행이 잘되었는데 좀 더 확인을 해봐야 할 것 같습니다.)
또한 정책에 의해서 다른 AB를 주입해주면서 Proxy, Factory 개체들을 생성하는데 바로 PostSharp4EntLib에서는 이러한 Proxy Factory를 제거하는 것을 목적으로 CodePlex에서 EL의 확장팩 정도의 개념으로 오픈소스로 공개되어 있습니다.

·         PostSharp4EntLib에서는 PostSharp의 컴파일 타임에 정책에 해당하는 객체들을 만들어놓고 런타임에 Proxy Factory 없이 사용하는 방식이라고 할 수 있습니다. 참고자료 2번에 링크로 가보시면 사용하는 방법이 3가지 나옵니다. 두 가지 아쉬운 점은 3가지 방법중에 마지막 방법이 제대로 동작하지 않는 것과 모든 방식이 정책 부분은 컴파일 타임에 만들어지지만 실질적으로 사용되는 AB의 설정은 App.config에서 불러옵니다. 예를 들어서 정책으로 Logging AB를 사용하면 정책은 컴파일 타임에 만들어지지만 Logging AB에 대한 정보는 App.config에 있어야 한다는 것입니다. 그래서 이 부분을 수정하여 현재는 Logging AB에 대해서만 App.config가 아닌 컴파일 타임에 정책이 만들어지면서 .config의 정보를 어셈블리 리소스에 저장하고 런타임에 불러와 사용하는 방식으로 변경해서 사용하고 있습니다.

4) 참고자료

1. PostSharp Doc : http://doc.postsharp.org/

2. PostSharp4EntLib : http://www.codeplex.com/entlibcontrib/Wiki/View.aspx?title=PostSharp4EntLib&referringTitle=Home

3. PIAB : http://msdn.microsoft.com/en-us/library/cc511729.aspx

 

Posted by resisa
,