2014-10-02 4 views
0

postsharp과 같은 aspect 지향 프로그래밍 프레임 워크를 수동으로 사용하는 것의 장점은 무엇입니까? 감사.aspect 지향 프로그래밍 프레임 워크

+1

그것은 시간을 절약하고 적절한 디자인을 적용합니다. 그러나 당신이 게시 한 링크에서 이미 읽었을 것입니다. – Madmenyo

+0

예. 그러나 프레임 워크를 수동으로 수행하는 것이 아니라 프레임 워크를 정당화해야합니다. 나의 주요 논쟁은 생산성이다. 나는 내가 간과 해 왔던 것이 있는지를 확인하고 싶었다. – cs0815

답변

1

깊은 잠수의 경우 Matthew D. Groves AOP in .NET: Pracitical Aspect-Oriented Programming을 읽을 수 있습니다.

그렇지 않으면 , Gael Fraiteur에있는 머리 녀석은 수시로 SO를 사용하기 때문에 여기에 튀어 나와있을 수도 있습니다.

핵심 AOP는 주요 논리에서 '교차 절단 문제'를 분리하는 것입니다. 로깅, 트랜잭션 관리 등과 같은 것들은 애플리케이션 전반에 걸쳐 사용되지만 코드는 주어진 클래스에만 한정되지 않고 반복적으로 사용됩니다. AOP를 사용하면 클래스에서이 코드를 제 거하고 다른 곳에서 사용할 수 있습니다. https://blog.safaribooksonline.com/2013/07/17/why-you-should-be-using-aspect-oriented-programming/에서

:

using System.Linq; 

public class StringReverser 
{ 
    IMyLogger _log; 

    public StringReverser(IMyLogger logger) 
    { 
     _log = logger; 
    } 

    public string Reverse(string text) 
    { 
     _log.WriteLine("MyFunction: " + DateTime.Now); 
     _log.WriteLine("text (string) argument: " + text); 

     string result = null; 
     if (text != null) 
      result = new string(text.Reverse().ToArray()); 

     _log.WriteLine("Return value: " + result); 

     return result; 
    } 

}

로깅 코드는 Reverse 및 클러까지 실제로 작업을 수행 얻는 코드와는 아무 상관이있다. AOP는 별도의 장소에 그 코드를 이동할 수 있습니다 :

public class StringReverser : IStringReverser 
    { 
     [LoggingAspect] 
     public string Reverse(string text) 
     { 
     if (text == null) 
      return null; 
     return new string(text.Reverse().ToArray()); 
    } 
    } 

그리고 로깅 코드 :

[Serializable] 
    public class LoggingAspect : MethodInterceptionAspect 
    { 
    IMyLogger _log; 

    public override void RuntimeInitialize(MethodBase method) 
    { 
     _log = MyServiceLocator.Get(); 
    } 

    public override void OnInvoke(MethodInterceptionArgs args) 
    { 
     var methodName = args.Method.Name; 
     var parameters = args.Method.GetParameters(); 

     _log.WriteLine(string.Format("{0} timestamp: {1}", methodName, 
       DateTime.Now)); 

     for (var i = 0; i < args.Arguments.Count; i++) 
      _log.WriteLine(string.Format("{0} argument #{1}, {2} ({3}): {4}", 
       methodName, 
       i, 
       parameters[i].Name, 
       parameters[i].ParameterType, 
       args.Arguments[i])); 

     args.Proceed(); 

     _log.WriteLine(string.Format("{0} return value: {1}", methodName, 
      args.ReturnValue)); 
    } 
} 
+0

감사합니다. 책을 읽고 개념을 이해합니다. 나는 단지 누군가에게 그것을 정당화하려고 노력하고있다. 나는 네가 수작업으로 직접 할 수 있다고 들었다. 나는 할 수 있다고 확신하지만, 포스트 샤프 (postsharp) 등이 생산성을 향상 시킨다는 의견이있다. MethodInterceptionAspect는 postsharp가 제대로 이해하면 상자 밖으로 제공되는 것으로 생각됩니다. – cs0815

+1

AOP를 수동으로 수행 할 수는 없습니다. 'Aspects'를 코드에 짜 넣기위한 프레임 워크가 필요합니다. Cross Cutter Concerns를 정적 유틸리티 클래스로 분리하고 그런 식으로 할 수 있다고 생각합니다. 그러나 많이 잃을 것입니다. DIY DI와 DI 프레임 워크가 비슷합니다. 당신은 의존성 주입을 스스로 할 수 있지만, 프레임 워크에서는 훨씬 더 좋네요. –

+1

아이디어는 1000 개의 비즈니스 메소드가 있거나 무엇이든 로그해야하는 경우 비즈니스 요구 사항에 로깅 측면/조언을 적용한다는 것입니다. 로깅이 어떻게 수행되는지, 어떤 인수가 포함되는지 등등. 업데이트 할 단일 측면 만 있습니다. "glue-code"를 사용하여 수동으로 수행하는 경우 1000 개의 호출 사이트를 업데이트해야합니다. 로깅은 AOP에 대한 가장 간단한 사용 사례 일 수 있습니다. 객체에 실행 취소/다시 실행을 적용하면 실제 성능이 발생하거나 더티 추적 엔티티 등 –

관련 문제