vamos a considerar algunos casos:En Castle Windsor, ¿puedo registrar un componente de interfaz y obtener un proxy de la implementación?
_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType));
En este caso, cuando pido una IProductServices Windsor será proxy de la interfaz para interceptar las llamadas a métodos de interfaz. Si en vez hago esto:
_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType));
entonces yo puedo pido Windsor para resolver IProductServices, en lugar pido ProductServices y ha de devolver una subclase dinámica que intercepte llamadas a métodos virtuales. Por supuesto, la subclase dinámica todavía implementa 'IProductServices'
Mi pregunta es: ¿Puedo registrar el componente Interfaz como el primer caso y obtener el proxy de subclase como en el segundo caso ?.
Hay dos razones para querer me esta:
1 - Debido a que el código que se va a resolver no puede saber acerca de la clase ProductServices, sólo alrededor de la interfaz IProductServices. 2 - Porque algunas invocaciones de eventos que pasan al remitente como parámetro pasarán el objeto ProductServices, y en el primer caso, este objeto es un campo en el proxy dinámico, no el objeto real devuelto por windsor. Déjeme darle un ejemplo de cómo esto puede complicar las cosas: Digamos que tengo una colección personalizada que hace algo cuando sus artículos notificar un cambio de propiedad:
private void ItemChanged(object sender, PropertyChangedEventArgs e)
{
int senderIndex = IndexOf(sender);
SomeActionOnItemIndex(senderIndex);
}
Este código se producirá un error si he añadido un proxy de interfaz, ya que la el remitente será el campo en el proxy de interfaz y el IndexOf (emisor) devolverá -1.
funcionado muy bien, gracias. –