2012-04-21 7 views
5

Después de leer y buscar en Google hasta el punto de agotamiento, creo que puedo necesitar alguna orientación.Castle Windsor 3.0, Services and Multiple Implementation

Esto puede deberse en parte a la introducción de Castle Windsor 3.0, sin embargo, la mayoría de las publicaciones de blog, las preguntas de SO y otra documentación dependen explícitamente de lo que puedo ver como código obsoleto.

Entonces: ¿El problema?

En mi aplicación, que es un servicio WCF que proporciona código de fondo a una aplicación MVC3, tengo varias capas, una de las cuales proporciona servicios de exploración de virus para un sistema de carga de archivos.

El cliente ha pedido apoyo para múltiples servicios de escaneo, naturalmente, he cumplido y cada servicio de escaneado implementa una interfaz IScanService, de esta manera:

public interface IScanService 
{ 
    void Execute(); 
    ScanResult GetResult(); 
} 

Así que en el servicio de WCF, donde el constructor puede verse como:

public McAfeeFileScanService(IScanService mcAfeeScanService) 
    { 
     _scanService = scanService; 
    } 

¿Cómo puedo especializo que el IScanService que se inyecta es del tipo de implementación McAfeeScanService o NortonScanService u otra aplicación?

AFAIK Windsor de forma predeterminada proporcionaría la primera implementación registrada, ya sea de tipo McAfeeScanService o no.

Estaba buscando en ServiceOverrides, sin embargo, eso parece haber quedado obsoleto en Windsor 3.0 a favor de DependsOn (Dependency.OnComponenent()) [pero no he podido encontrar ningún ejemplo relevante] También he investigado las instalaciones de Typed Factory , y en IHandlerSelector, pero creo que se necesita alguna orientación para esta tarea (aparentemente común y probablemente simple).

Gracias a todos.

Respuesta

7

ServiceOverride está en desuso en Windsor 3. Tienes que usar Dependency.OnComponent así:

Component.For<ISerializer>().ImplementedBy<JsonSerializer>().Named("jsonSerializer"), 
Component.For<WebConnectionAcceptor, IChannelManager>().ImplementedBy<WebConnectionAcceptor>().Named("webAcceptor"), 
Component.For<ConnectionAcceptorProxy>().Named("webProxy").DependsOn(
     Dependency.OnComponent("connectionAcceptor", "webAcceptor"), 
     Dependency.OnComponent("serializer", "jsonSerializer")) 

primer argumento en OnComponent se nombre vinculante, la segunda es el nombre del componente.

+1

Sí, esta es la conclusión a la que acudí, aplausos por la respuesta. ¡Acepto esto como respuesta! – M05Pr1mty

0

He publicado algo muy parecido a esto. Tenía dos implementaciones de una interfaz y quería que un controlador MVC utilizara una de esas implementaciones según lo decidido por mí.

En el article explico una forma de hacerlo, pero el código fuente adjunto muestra otras dos formas.

Espero que esto ayude.

Cuestiones relacionadas