2010-05-01 47 views
5

讓我們考慮一些情況:在Castle Windsor,我可以註冊一個Interface組件並獲得實現的代理嗎?

_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType)); 

在這種情況下,當我問一個IProductServices溫莎將代理的接口攔截接口方法調用。 相反,如果我這樣做:

_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType)); 

那麼我不能要求溫莎解決IProductServices,而不是我要求的ProductServices,它會返回一個動態的子類,將攔截虛方法調用。 當然,動態子類仍然實現'IProductServices'

我的問題是:我可以像第一種情況註冊接口組件,並像第二種情況下獲得子類代理?

我想要這個的原因有兩個:
1 - 因爲要解析的代碼無法知道ProductServices類,所以只關於IProductServices接口。 2 - 因爲某些將發件人作爲參數傳遞的事件調用將傳遞ProductServices對象,並且在第一種情況下,此對象是動態代理上的字段,而不是windsor返回的實際對象。讓我舉這可怎麼複雜的事情的例子:比方說,我有一個自定義集合,做一些事情時,他們的項目通知屬性變化:

private void ItemChanged(object sender, PropertyChangedEventArgs e) 
    { 
     int senderIndex = IndexOf(sender); 
     SomeActionOnItemIndex(senderIndex); 
    } 

如果我增加了一個接口代理此代碼將失敗,因爲發件人將是接口代理中的字段,並且IndexOf(發件人)將返回-1。

回答

5

是的,你可以:

_windsor.Register(Component.For<ProductServices, IProductServices>() 
    .Interceptors(typeof(SomeInterceptorType)); 
+1

工作非常出色,謝謝。 – 2010-05-01 20:38:42

相關問題