2009-03-26 5 views
6

Mi piacerebbe configurare il contenitore Windsor in modo che una singola istanza in stile singleton possa fornire due o più servizi attraverso il contenitore.Come configurare un'istanza a componente singolo che fornisce più servizi in Castle.Windsor?

Ho riscontrato che l'utilizzo dello stesso tipo in dichiarazioni di più componenti (configurazione basata su XML) comporta la creazione di un'istanza di quel tipo per fornire l'interfaccia di servizio di ciascun componente, che non è il comportamento che desidero.

Ad esempio:

interface IA { } 
interface IB { } 
class AB : IA, IB { ... } 

voglio quella istanza di AB per fornire sia i servizi di IA e IB.

Il motivo specifico per cui voglio farlo è che la mia implementazione DAO concreta estende più interfacce. Il rovescio della medaglia, ho diversi componenti di lavoro che contengono un riferimento a diverse interfacce. L'istanza DAO concreta rispetta questo, ma i costruttori di questi componenti separati dei lavoratori vogliono l'implementazione delle loro interfacce separate e desidero che Castle.Windsor passi la stessa istanza dell'oggetto attraverso questi contenitori worker tramite le rispettive richieste di servizio.

lol, penso che fosse chiaro come fango! : P

Qualcuno capisce cosa intendo, e qualcuno ha qualche idea su come posso ottenerlo attraverso la configurazione XML dei componenti?

risposta

3

Avete estratto la risposta a this question (in particolare il link al post del forum) che sembra essere quello che state cercando. Alcuni degli esempi utilizzano il ciclo di vita Transient, ma penso che funzionerà anche con Singleton.

Il principale pay-off del forum post è:

container.Register(Component.For<IEntityIndexController, ISnippetController>() 
.ImplementedBy<SnippetController>() 
.LifeStyle.Transient); 

La soluzione è utilizza l'interfaccia fluente (e un recente costruzione tronco) e non era possibile configurare in XML ultimo che ho visto. Tuttavia, è may be possible con una struttura.

Buona fortuna!

0

È possibile registrare un istanza di un oggetto (invece di un'implementazione) per essere responsabile di diverse implementazioni:

var ab = new AB(); 
    container.Register(Component.For<IA>().Instance(ab)); 
    container.Register(Component.For<IB>().Instance(ab)); 

credo che dovrebbe funzionare. Tuttavia, ciò richiede la configurazione del codice, per motivi apparenti.

+0

Il problema principale con questo è l'utilizzo dell'operatore "nuovo", il che significa che non si utilizza l'autowiring per AB. –

+0

L'ultima riga dovrebbe essere qualcosa come 'container.Register (Component.For () .Instance (ab) .Named (" IBImplementation "));' o otterrai _ComponentRegistrationException: Component AB non può essere registrato. Esiste già un componente con quel nome._ – Lu55

1

Hai provato a usare il metodo Forward:

container.Register(Component.For<IEntityIndexController>() 
.ImplementedBy<SnippetController>() 
.Forward (typeof(ISnippetController)) 
.LifeStyle.Transient); 

Da miei esperimenti e dalla documentazione:

registrare i tipi di servizio per conto di questa componente

penso fare il trucco.

+0

Esiste un modo per farlo dall'XML di configurazione? – Ash

+0

Non lo so :( –

0

Stavo cercando la stessa risposta, e questo post è il più lontano che potrei ottenere con google.Ho trovato che usando

Classes.FromThisAssembly().Where(t => t.FullName == "Namespace.Classname").WithServiceAllInterfaces() 

Sembra fare il trucco per me.

Problemi correlati