讓我們考慮一些情況:在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。
工作非常出色,謝謝。 – 2010-05-01 20:38:42