2010-05-01 14 views
5

Bazı durumları ele alalım: Castle Windsor'da, bir Arayüz bileşenini kaydedebilir ve uygulamanın bir proxy'sini alabilir miyim?

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

Bu durumda, bir IProductServices için sorduğumda, windsor arabirimi, arabirim yöntem çağrılarını engellemek için proxy edecektir. Bunun yerine şunu yaparım:

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

daha sonra IProductServices'ı çözümlemek için windsor isteyemiyorum, bunun yerine ProductServices'ı istiyorum ve sanal yöntem çağrılarını engelleyen dinamik bir alt sınıfı döndürecektir. Tabii ki dinamik alt sınıf hala 'IProductServices'

'i uyguluyor Benim sorum: Birinci bileşen gibi Arabirim bileşenini kaydedebilir ve ikinci durumda olduğu gibi alt sınıf proxy'sini alabilir miyim?

Bunu istememin iki nedeni var:
1 - Çözümlenecek kod ProductServices sınıfını bilmediğinden, sadece IProductServices arabirimi hakkında. 2 - Göndereni bir parametre olarak geçiren bazı olay girişimleri, ProductServices nesnesini geçireceğinden ve ilk durumda bu nesne, dinamik proxy üzerindeki bir alan, windsor tarafından döndürülen gerçek nesne değil. Bunun işleri nasıl karmaşıklaştırabileceğine dair bir örnek vereyim: Öğeleri bir özellik değişikliğini bildirdiğinde bir şey yapan özel bir koleksiyonum olduğunu söyleyelim:

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

Bir arabirim proxy eklediysem, bu kod başarısız olur çünkü gönderici, arabirim proxy'sindeki alan olacaktır ve IndexOf (gönderici) -1 değerini döndürecektir.

cevap

5

Evet, yapabilirsiniz:

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

, çok iyi teşekkürler çalıştı. –

İlgili konular