2012-04-21 23 views
5

Avendo letto e cercato fino al punto di esaurirsi, ho la sensazione di avere bisogno di una guida.Castle Windsor 3.0, Servizi e implementazione multipla

Ciò può essere in parte dovuto all'introduzione di Castle Windsor 3.0, tuttavia la maggior parte dei post del blog, domande SO e altra documentazione dipendono esplicitamente da quello che posso vedere ora è un codice deprecato.

Quindi: il problema?

Nella mia applicazione, che è un servizio WCF che fornisce il codice di back-end a un'applicazione MVC3, dispongo di più livelli, uno dei quali fornisce servizi di scansione antivirus per un sistema di caricamento file.

Il cliente ha chiesto il supporto per i servizi di scansione più, naturalmente, ho rispettato e ogni servizio di scansione implementa un'interfaccia IScanService, questa convenzione:

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

Così nel servizio WCF, in cui il costruttore può apparire come:

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

Come posso specializzo che l'IScanService che viene iniettato è di tipo implementazione McAfeeScanService, o NortonScanService o altre implementazioni?

AFAIK Windsor fornisce di default la prima implementazione registrata, che sia di tipo McAfeeScanService o meno.

Stavo cercando ServiceOverrides, tuttavia sembra essere stato deprecato in Windsor 3.0 in favore di DependsOn (Dependency.OnComponenent()) [ma non sono riuscito a trovare alcun esempio pertinente] Ive ha anche esaminato le installazioni di Typed Factory e in IHandlerSelector, ma ritengono che sia necessaria una guida per questo compito (apparentemente comune e probabilmente semplice).

Grazie a tutti.

risposta

7

ServiceOverride è deprecato a Windsor 3. Devi usare Dependency.OnComponent come questo:

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")) 

primo argomento OnComponent è vincolante nome, secondo è il nome del componente.

+1

Sì, questa è la conclusione a cui sono venuto, esulta per la risposta. Ill acept questo come risposta! – M05Pr1mty

0

Ho postato qualcosa di molto simile a questo. Avevo due implementazioni di un'interfaccia e volevo un controller MVC per utilizzare una di quelle implementazioni come deciso da me.

Nel article Spiego un modo per farlo, ma il codice sorgente allegato mostra altri due modi.

Spero che questo aiuti.

Problemi correlati