2015-02-06 19 views
7

W scenariuszu Zamek Windsor chcę sprawdzić, czy mój zbiornik ma pewną usługę zarejestrowany, a nie w zasadzieSprawdź, czy Windsor ma komponent dopasowanie zarejestrowany

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

Ale oczywiście container.HasComponentFor<IMyService>() nie istnieje. Czy istnieje odpowiednik?

Odpowiedz

18

Można sprawdzić czy mikrojądro posiada komponent zarejestrowany:

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

to nie wydawać się najlepszym rozwiązaniem. Myślę, że napiszę metodę rozszerzenia na 'IWindsorContainer', aby dopasować składnię, której chciałem =) –

+0

@ TomasLycken Próbowałem tego kawałka kodu, który skutkuje wyjątkiem ' if (Ioc.Container.Kernel.HasComponent (typeof (myInterface)))) { Ioc.Container.Release (Ioc.Container.Resolve ()); Ioc.Container.Register (składnik. Dla () .Instance (myObjectInstance) .LifeStyle.Transient); } ' Ale kiedy próbuję zarejestrować komponent wewnątrz instrukcji if, powoduje to błąd, mimo że został już zwolniony. Mówi, że komponent jest już zarejestrowany. Moja wersja zespołu windsor winds to 2.5.1 – RBT

+0

Release nie usuwa komponentu z kontenera. Jeśli chcesz dodać nowy komponent, który nadpisuje istniejący, po prostu dodaj go za pomocą "IsDefault()", tj. 'If (Ioc.Container.Kernel.HasComponent (typeof (myInterface))) { \t Ioc .Container.Register (Component. For () .Instance (myObjectInstance) .IsDefault(). L ifeStyle.Transient); } ' –

2

można spróbować container.Kernel.HasComponent()

Powiązane problemy