2014-01-15 101 views
4

我有一個城堡攔截器,我試圖通過屬性來應用。當我在類級應用我的Interceptor屬性時,它工作得很好,但是當我在方法級應用時,它根本不工作。我究竟做錯了什麼?我不想攔截類中的每個方法,而是用[Interceptor]屬性標記某些方法。我試圖將我的方法標記爲虛擬,但它仍然不起作用。這裏是我的代碼:城堡溫莎攔截器不與方法級屬性一起工作

這工作和所有的方法都截獲:

[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

但是,我沒有看到使用IInterceptorSelectorInterceptor屬性的任何方式。

+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