2016-10-02 2 views
2

명시 적으로 함수 호출을 추가하지 않고도 일련의 함수에 대한 호출을 기록하거나 추가하는 더 좋은 방법이 있습니까? 내가 좋아하는 클래스가 예를 들어로깅을 추가하는 더 좋은 방법이나 모든 기능에서 발생해야하는 방법은 무엇입니까?

:

public class MyClass 
{ 

public void DoStuff() 
{ 
doSomethingEnter(); 

//MyCode 

doSomethingExit(); 
} 

public void DoStuff_2() 
{ 
doSomethingEnter(); 

//MyCode 

doSomethingExit(); 
} 
} 

doSomethingEnter()와 doSomethingExit() 함수의 시작과 끝에서 발생해야 할 다른 일 전화 통화 또는 이벤트를 로깅 할 수 있습니다.

public class MyClass 
{ 

[DoSomethingEnterExit] 
public void DoStuff() 
{ 
    //MyCode 
} 
} 

그러나 내가 PostSharp 같은 AOP 프레임 워크를 구입하지 않고 비슷한 할 수있는 패턴이나 프레임 워크가 :

나는 나에게 이런 일을 수행 할 수 있습니다 Aspect 지향적 인 프로그래밍에 읽고 ?

감사합니다.

편집

나는 또한 항상 시작 및 종료 기능을 가지고 마스터 방법으로 호출되는 확실히 물건을 만들기 위해 외관의 종류를하고로 보았다.

+0

유망한 것 같습니다 : https://github.com/AntyaDev/KingAOP – RS999

+0

기본 클래스의 생성자/소멸자를 시도해 볼 수 있습니다. – Asmodiel

+0

@Asmodiel은 함수의 끝에서 실행되도록 보장 된 exit 함수입니까? 소멸자가 가비지 수집 일정에 의존하지 않습니까? – RS999

답변

2

AOP (Aspect Oriented Programming)를 사용하면 컴파일 타임에 코드에 투명하게 로그인 할 수 있습니다.

PostSharp는 .Net 용 AOP 라이브러리이며 리플렉션 속성을 사용하여 코드에 마커 (애스펙트)를 넣은 다음 사전 컴파일러에서 해당 마커를 찾아 실제 코드로 바꿉니다.

공개 : 저는 PostSharp와 관련이 없지만 이전에 일부 프로젝트에서 사용했습니다.

편집 :

  • 지금까지 내가 기억하는, 여전히 로깅 시나리오에 대해 작동합니다 PostSharp의 무료 및 오픈 소스 버전이있다.

  • .Net 생태계에서 다른 AOP 라이브러리에 대해 들어 보지 못했습니다.

1

캐슬 윈저는 이것을 수행 할 interceptors을 제공합니다. 이 작업을 위해 전체 IoC 프레임 워크를 사용하고 싶지 않다면 똑같은 작업을 위해 DynamicProxy으로 바로 갈 수 있습니다. 그러나 IoC 컨테이너 핸들링을 사용하면 멋지고 깔끔합니다.

Decorator 패턴을 사용할 수도 있습니다. 그러나이 문제는 많은 경우 코드가 크게 확산되는 결과를 가져옵니다.

차단 또는 장식을 사용할 때 고려해야 할 단점은 각 패턴이 추가하는 추가 관심사가 투명하다는 것입니다. 이는 노이즈를 줄이는 데는 효과적이지만 코드를 지원하는 사람들이 개념을 인식하지 못하거나 익숙하지 않은 경우 디버깅이나 향상이 어려울 수 있습니다.

아래의 설명에서 @Bishoy에 의해 강조된 추가 단점은 '정적'접근 방식이 성능에 영향을 줄 수있는 런타임 솔루션이라는 점입니다.

+0

AOP 접근 방식에 비해 성능 영향에 대해서도 언급 하시길 바랍니다. – Bishoy

+0

@Bishoy 귀하의 특정 관심사는 무엇입니까? 그것은 내가 어느 정도의 세부 사항으로 언급 할 수있는 것이 아닙니다. –

+0

컴파일 타임 (정적)과 런타임 (동적)은 응용 프로그램의 성능에 중요한 영향을 미칩니다. 동적 프록시는 동적 런타임 솔루션입니다. 세부 사항은 애플리케이션에 따라 다릅니다. – Bishoy

관련 문제