2011-04-20 1 views
4

우리는 IoC (Unity)와 종속성 삽입을 사용하고 있으며 이제는 메소드의 입력/종료를 기본적으로 기록하는 PostSharp와의 aspect를 만들고 싶습니다. 내 문제는 내 로거가 구성되어 단일체 컨테이너에 등록되어 있다는 것입니다. 내 측면에서 로거를 해결하는 가장 좋은 방법은 무엇입니까?PostSharp 애스 팩트 해결 유형

참고 : 단일체로 인터셉터를 사용하는 것은 옵션이 아닙니다. 나는이 수업이 화합을 통해 해결되지 않고 일하기를 바랍니다.

+0

인터셉터를 사용하여 동적이고 유연하게 유지할 수있는 경우 왜 정적으로 (포스트) 컴파일을 코드에 컴파일 하시겠습니까? –

+0

글쎄, 주로 이러한 클래스는 컨테이너의 일부가 아니기 때문에 – Michael

답변

2

OnMethodBoundaryAspect 및 OnMethodEntry/OnMethodExit에서 상속 한 aspect를 사용하여 aspect에서 Unity로 호출하여 로거를 해결 한 다음 로깅을 수행하십시오.

은 (클래스, 메소드 또는 조립 레벨)

[Serializable] 
    [MulticastAttributeUsage(MulticastTargets.Method, Inheritance=MulticastInheritance.Strict)] 
    public class LogAspect : OnMethodBoundaryAspect 
    { 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      var Logger = Unity.Resolve<T>(); 
      Logger.Write(args.Method.Name + " enter"); 
     } 

     public override void OnExit(MethodExecutionArgs args) 
     { 
      var Logger = Unity.Resolve<T>(); 
      Logger.Write(args.Method.Name + " exit"); 
     } 
    } 

당신의 단결 컨테이너를 얻으려면 나는 서비스 로케이터 패턴을 사용하려면 어쨌든 화면을 적용합니다.

이하는 ILogger 클래스와 응용 프로그램 초기화 방법으로 수업 화면

public class LogAspect : OnMethodBoundaryAspect 
{ 
    /// <summary> 
    /// Gets or sets the logger. 
    /// </summary> 
    public static ILogger logger { get; set; } 

세트 로거 변수에 정적 속성 로거를 추가하고이 초기화하기 전에 모든 방법을 제외 서비스 로케이터없이

public class iocServiceLocator 
    { 
     private static readonly IUnityContainer _container; 

     static iocServiceLocator() 
     { 
      _container = new UnityContainer(); 
     } 

     public static void Initialize() 
     { 
      InitializeBootStrap(); 
     } 

     private static void InitializeBootStrap() 
     { 
      //Register types here       
     } 

     public static T Get<T>() 
     { 
      return _container.Resolve<T>(); 
     } 

     public static T Get<T>(string key) 
     { 
      return _container.Resolve<T>(key); 
     } 


    }