2012-11-03 4 views
13

나는 자신의 구현을 계속하기 전에 모두 동일한 기능을 수행해야하는 다양한 개별 메소드를 가지고있다. 이제 각 메소드에서 이러한 함수를 구현할 수 있지만이 방법을 사용하면 궁금합니다. attributes? 아주 간단한 예로서 모든 네트워크 호출은 네트워크 연결을 확인해야합니다.속성을 사용하여 메소드 호출하기

public void GetPage(string url) 
{ 
    if(IsNetworkConnected()) 
     ... 
    else 
     ...   
} 

이 작동 것입니다,하지만 난 네트워크를 사용하는 각 방법에 대한 IsNetworkConnected 메서드를 호출하고 개별적으로 처리해야 할 것이다. 네트워크 오류 방법 대신 호출되고 GetPage이 무시되고, 그렇지 않으면 GetPage가 호출을 사용할 수없는 경우 대신,이

[NetworkCall] 
public void GetPage(string url) 
{ 
    ... 
} 

을하고 싶습니다.

이것은 Aspect Orientated Programming과 매우 비슷하지만 몇 가지 호출을 위해 전체 프레임 워크를 구현하고 싶지 않습니다. 이것은 구현 사례보다 더 많은 학습 과제이므로, 이와 같은 것이 어떻게 구현 될지 궁금합니다.

+0

상속은 어떨까요?그것들 모두가 기본 "Network"클래스 또는 그와 유사한 것으로부터 파생되도록하십시오. – gdoron

답변

3

당신은 PostSharp을 사용할 수 있습니다, 그것은 .NET에 대한 aspect 지향 프레임 워크, 그것은 quite easy to use 보인다

static void Main(string[] args) 
{ 
    Foo(); 
} 

[IgnoreMethod(IsIgnored=true)] 
public static void Foo() 
{ 
    Console.WriteLine("Executing Foo()..."); 
} 

[Serializable] 
public class IgnoreMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect 
{ 
    public bool IsIgnored { get; set; } 

    public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args) 
    { 
     if (IsIgnored) 
     { 
      return; 
     } 

     base.OnInvoke(args); 
    } 
} 

방법 수준의 측면을 기능은 무료 버전에서 사용할 수 있습니다 : http://www.sharpcrafters.com/purchase/compare

런타임 성능 :

PostSh arp는 컴파일러 기술이므로 대부분의 비싼 작업은 빌드시에 완료되므로 응용 프로그램이 신속하게 시작되고 빠르게 실행됩니다. 코드를 생성 할 때 PostSharp는 가상 메소드를 호출하거나 정적 필드를 가져 오는 것이 값 비싼 연산이라는 가정을 취합니다. 소문과 달리 PostSharp는 런타임에 System.Reflection을 사용하지 않습니다. http://www.sharpcrafters.com/postsharp/performance

+0

PostSharp는 반사 레이어를 통과해야하기 때문에 비효율적 일 것이라고 생각했지만, 대부분의 경우 컴파일 시간에 소리가납니다. 좋고 깨끗한 API. 내 프로젝트 중 일부를 시도해 볼 수 있습니다. – mpen

+0

예, 웹 사이트에서 방금 읽었습니다.''소문과 달리 PostSharp는 런타임에 System.Reflection을 사용하지 않습니다. " http://www.sharpcrafters.com/postsharp/performance 따라서 성능은 ' 문제가되는 것 같습니다. – maximpa

+0

감사합니다. PostSharp를 살펴 보겠습니다. 특별히 프레임 워크를 사용하고 싶지는 않지만 대안이없는 것 같습니다. – keyboardP

1

attributes으로는 이것을 수행 할 수 없다고 생각합니다. 실제로 무언가를하지 않으면 런타임에 의해 실행되지 않기 때문입니다. 가벼운 접근 방식은 Ninject with Interceptions extension이 될 것이지만 프레임 워크이지만 매우 얇은 방법 일 것입니다. 이미 DI 용으로 사용하고있을 것입니다.

또 다른 옵션이지만 조금 더 복잡하면 MEF을 기반으로 할 수 있으며 속성을 사용하고 활성화하는 동안 속성을 사용할 수 있습니다.

1

맞아요, AOP처럼 들립니다.
컴파일 시간 짜기와 같은 소리가 들리는가요? 나는. 속성은 컴파일러에 의해 추가 코드로 변환됩니다. 당신은이를 구현하는 방법을 볼 수 있었다
은 ... Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving

모든 도구와이 작업을 수행하는 방법을 참조하십시오.

또는 AOP 프레임 워크를 사용할 수 있습니다. IMHO, 당신은 AOP 프레임 워크를 봐야한다.

관련 문제