2010-05-01 8 views
5

Consente di considerare alcuni casi:In Castle Windsor, posso registrare un componente di interfaccia e ottenere un proxy dell'implementazione?

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

In questo caso, quando chiedo un IProductServices Windsor si procura l'interfaccia per intercettare le chiamate di metodo di interfaccia. Se invece faccio questo:

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

quindi non posso chiedere Windsor a risolvere IProductServices, invece chiedo ProductServices e restituirà una sottoclasse dinamica che intercettare le chiamate metodo virtuale. Ovviamente la sottoclasse dinamica implementa ancora "IProductServices"

La mia domanda è: Posso registrare il componente Interface come il primo caso e ottenere il proxy della sottoclasse come nel secondo caso ?.

Ci sono due ragioni per me che vogliono questo:
1 - Poiché il codice che sta andando a risolvere non può conoscere sulla classe ProductServices, solo circa l'interfaccia IProductServices. 2 - Poiché alcune invocazioni di eventi che passano il mittente come parametro, passeranno l'oggetto ProductServices e nel primo caso questo oggetto è un campo sul proxy dinamico, non l'oggetto reale restituito da windsor. Vi faccio un esempio di come questo può complicare le cose: Diciamo che ho una collezione personalizzata che fa qualcosa quando i loro elementi notificare un cambiamento di proprietà:

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

Questo codice avrà esito negativo se ho aggiunto un proxy di interfaccia, in quanto il il mittente sarà il campo nel proxy di interfaccia e IndexOf (mittente) restituirà -1.

risposta

5

Sì, è possibile:

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

lavorato molto bene, grazie. –