2014-01-15 2 views
4

속성을 통해 적용하려고하는 성 인터셉터가 있습니다. 클래스 레벨에서 Interceptor 속성을 적용하면 효과적이지만 메서드 수준에 적용 할 때는 전혀 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 클래스의 모든 메소드를 인터셉트하지 않고 [Interceptor] 속성을 사용하여 특정 메소드를 플래그 지정합니다. 내 메서드를 가상으로 표시하려고 시도했지만 여전히 작동하지 않습니다. 여기에 내 코드입니다 :이 작동Castle-Windsor 인터셉터가 메소드 - 레벨 속성과 함께 작동하지 않습니다.

모든 방법이 차단됩니다

[Interceptor(typeof(CacheInterceptor))] 
public class Foo : IFoo 
{ 
    public int SomeMethod() { } 
} 

이 작동하지 않습니다 (속성은 메소드 레벨에있다) :

public class Foo : IFoo 
{ 
    [Interceptor(typeof(CacheInterceptor))] 
    public int SomeMethod() { } 
} 

설치 :

public class CacheInterceptorInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Component.For<CacheInterceptor>().LifeStyle.Singleton); 

     container.Register(Component 
      .For<ICacheProvider>() 
      .LifeStyle.Singleton 
      .ImplementedBy<CacheProvider>()); 
    } 
} 

요격기 :

public class CacheInterceptor : IInterceptor 
{ 
    private readonly ICacheProvider _cacheProvider; 

    public CacheInterceptor(ICacheProvider cacheProvider) 
    { 
     _cacheProvider = cacheProvider; 
    } 

    public void Intercept(IInvocation invocation) 
    { 
     // do interception stuff 
    } 
} 

감사합니다,

앤디

답변

3

불행하게도, 난 그냥 방법에 Interceptor 속성을 사용하는 방법이 있다고 생각하지 않습니다. http://docs.castleproject.org/Windsor.Interceptors.ashx에서 :

InterceptorAttribute는 클래스에 있지만, 사용자 정의 속성이 인터페이스 또는 방법처럼, 허용되는 다른 대상에뿐만 아니라 넣을 수있는 방법으로 정의된다. 그러나 Windsor는 구성 요소 구현 클래스에 있지 않으면 속성을 무시합니다. 이 허용 동작은 사용자가 사용자 지정 확장 프로그램을 작성하여 다른 대상에 대한 지원을 추가 할 수 있도록하기 위해 도입되었습니다.

내가 성에서 유용 할 수 있습니다 뭔가 IProxyGenerationHook 및/또는 IInterceptorSelector입니다 생각

(강조는 내 꺼야). 이것에 관한 일부 문서 : http://docs.castleproject.org/Tools.Use-proxy-generation-hooks-and-interceptor-selectors-for-fine-grained-control.ashx

Interceptor 속성과 함께 IInterceptorSelector을 사용하는 방법은 전혀 없습니다. 당신은 방법을 선택 속성 정의 사용할 수 있습니다

+0

이 나를 슬프게한다. 나는 AOP에 꽤 새로 왔지만, 메소드 레벨 인터셉터가 제공 할 수있는 좋은 기능이 될 것 같다. 도와 주셔서 감사합니다! – Andy

+0

PostSharp를 사용하면 시도하고있는 것을 훨씬 쉽게 수행 할 수 있습니다. –

7

을 차단합니다 :

[Interceptor(typeof(CacheInterceptor))] 
public class Foo : IFoo 
{ 
    [Cache] 
    public int SomeMethod() { } 
} 

그런 방법을 확인 Intercept에서,이 방법은 사용자 지정 특성이있는 경우 :

if (invocation.MethodInvocationTarget.IsDefined(typeof(CacheAttribute))) { 
    // do interception stuff 
} 
+0

감사합니다. 이것은 좋은 해결책입니다. 클래스의 모든 메소드를 인터셉트하지 않고도 이것을 수행 할 수있는 더 깨끗한 방법이 있기를 바랍니다. – Andy