2015-02-06 12 views
7

In uno scenario di Castello di Windsor voglio verificare se il mio contenitore ha un determinato servizio registrato, e fanno fondamentalmenteControllare se Windsor ha una componente di corrispondenza registrata

if (container.HasComponentFor<IMyService>()) { 
    // resolve service with container.Resolve<IMyService>() 
    // then do cool stuff 
} 

ma, naturalmente, container.HasComponentFor<IMyService>() non esiste. C'è un equivalente?

risposta

18

È possibile controllare se il microkernel ha registrato il componente:

if (container.Kernel.HasComponent(typeof(IMyService))) 
    // resolve service with container.Resolve<IMyService>() 
    // then do cool stuff 
} 
+1

Questo sembra come l'opzione migliore. Penso che scriverò un metodo di estensione su 'IWindsorContainer' per far corrispondere la sintassi che volevo =) –

+0

@TomasLycken Stavo provando questo pezzo di codice che risulta nell'eccezione ' if (Ioc.Container.Kernel.HasComponent (typeof (myInterface))) { Ioc.Container.Release (Ioc.Container.Resolve ()); Ioc.Container.Register (Component.For (). Instance (myObjectInstance) .LifeStyle.Transient); } ' Ma quando provo a registrare il componente all'interno dell'istruzione if, esso genera un errore anche se era già stato rilasciato. Dice che il componente è già registrato. La versione del mio windsor del castello è 2.5.1 – RBT

+0

Release non rimuove il componente dal container. Se è necessario aggiungere un nuovo componente che sovrascrive quello esistente, è sufficiente aggiungerlo con "IsDefault()", ovvero "if (Ioc.Container.Kernel.HasComponent (typeof (myInterface))) { \t Ioc .Container.Register (Component.For (). Instance (myObjectInstance) .IsDefault(). L ifeStyle.Transient); } ' –

2

Si potrebbe provare container.Kernel.HasComponent()