2012-01-03 2 views
3

assemblyA의 형식을 내 콘솔에서 사용하여 AOP 스타일 로깅을 허용하도록 응용 프로그램을 구성하려고합니다. JournalInterceptor는 메서드 호출, 입력 및 어쩌면 출력 인수를 일종의 로그 파일이나 데이터 저장소에 씁니다.Windsor 및 일괄 등록 클래스를 사용하는 AOP

한 번에 한 가지 유형을 등록 할 수 있지만 한 번에 모든 유형을 등록하고 싶습니다. 일단 내가 가면 등록 된 유형에 필터링을 추가 할 수 있지만 뭔가 빠져 있습니다. 나는 Classes.FromAssemblyContaining을 사용하려고하지만 WindsorContainer::Register

모든 단서가 호출에 대한 IRegistration 예를 얻을하는 방법을 잘 생각하고

?

// otherAssembly.cs 
namespace assemblyA 
{ 
    public class Foo1 { public virtual void What(){} } 
    public class Foo2 { public virtual void Where(){} } 
} 
// program.cs 
namespace console 
{ 
    using assemblyA; 

    public class JournalInterceptor : IInterceptor {} 

    public class Program 
    { 
    public static void Main() 
    { 
     var container = new Castle.Windsor.WindsorContainer() 
      .Register(
       Component.For<JournalInterceptor>().LifeStyle.Transient, 
       // works but can't be the best way 
       Component.For<Foo1>().LifeStyle.Transient 
        .Interceptors<JournalInterceptor>(), 
       Component.For<Foo2>().LifeStyle.Transient, 
        .Interceptors<JournalInterceptor>(), 
       // how do I do it this way 
       Classes.FromAssemblyContaining<Foo1>() 
         .Pick() 
         .LifestyleTransient() 
         .Interceptors<JournalInterceptor>() 
        ); 

     Foo1 foo = container.Resolve<Foo1>(); 
    } 
    } 
} 

답변

4

Pointcut을 구현하십시오. Castle Windsor에서는 IModelInterceptorsSelector 인터페이스를 구현하여이 작업을 수행합니다.

그것은 이런 식으로 뭔가를 갈 것 :

public class JournalPointcut : IModelInterceptorsSelector 
{ 
    public bool HasInterceptors(ComponentModel model) 
    { 
     return true; // intercept everything - probably not a good idea, though 
    } 

    public InterceptorReference[] SelectInterceptors(
     ComponentModel model, InterceptorReference[] interceptors) 
    { 
     return new[] 
     { 
      InterceptorReference.ForType<JournalInterceptor>() 
     }.Concat(interceptors).ToArray(); 
    } 
} 

는 그런 용기와 인터셉터와 포인트 컷을 등록 :

this.container.Register(Component.For<JounalInterceptor>()); 

this.container.Kernel.ProxyFactory.AddInterceptorSelector(new JournalPointcut()); 

깊이있는 설명은, 당신이 this recording를 볼 수 있습니다.

+0

감사합니다. 나는 저널링을 원했던 서비스 (사용자 지정 속성을 통해)를 필터링 한 후에 작동했습니다. 내가 시간을 얻 자마자 비디오 세션을 볼거야. –

관련 문제