Mam IWindsorContaner, który istnieje przez cały okres użytkowania aplikacji. W przypadku Unittestów możliwe jest zarejestrowanie mocks/stubów itp. Pod ich typem. Po zakończeniu testu i umieszczeniu urządzenia zarejestrowane komponenty do testu są usuwane za pomocą samodzielnie utworzonej metody o nazwie "Wyrejestruj".W jaki sposób komponenty są usuwane z Castle 3.0?
Teraz chcę zaktualizować do najnowszej wersji Castle, która jest 3.0. Według komunikatu 3.0 zauważa coś
public void Unregister(string contextName, string registrationName)
{
IWindsorContainer context = GetOrCreateContext(contextName);
context.Kernel.RemoveComponent(registrationName);
}
nie jest już możliwe, ponieważ metoda IKernel.RemoveComponent został usunięty. Opis rozwiązania tego problemu nie jest wystarczający ("Spróbuj użyć IHandlerSelectors.").
Uproszczona wersja urządzenia używać do unittests:
public sealed class DependencyInjectionFixture : IDisposable
{
private Stack<Type> registeredTypes = new Stack<Type>();
// Registering of mocks/stubs, etc
public void RegisterSingleton<T>(T singleton, string objectName)
{
registeredTypes.Push(typeof(T));
IWindsorContainer context = GetOrCreateContext(contextName);
context.Register(Component.For(typeof(T))
.Named(objectName)
.Instance(singleton)
.LifeStyle.Singleton);
}
// Called when tests ends
public void Dispose()
{
IWindsorContainer context = GetOrCreateContext(contextName);
while (registeredTypes.Count > 0)
context.Kernel.RemoveComponent(CSApplicationContext.GetRegistrationNameFor(registeredTypes.Pop()));
}
}
Jak mogę usunąć elementy z zamkiem 3.0?
Oczywiście to by działało. Ale wymagałoby to również wielu zmian kodu w wielu zależnych projektach oprogramowania. Znalazłem rozwiązanie polegające na umieszczeniu obiektu z pojemnikiem na pojemniku zamiast prawdziwego. Ale im więcej o tym myślę, Castle naprawdę nie wydaje się być właściwym pojemnikiem IoC do unittests, prawda? – Antineutrino
Dla wszystkich testów jednostkowych, które napisałem w tym punkcie, Castle był dokładnie idealnym pojemnikiem IoC do testów jednostkowych. Dlaczego mimo wszystko trzeba wyczyścić wszystkie zarejestrowane podmioty? – eouw0o83hf
Ponieważ każdy test jednostkowy rejestruje swoje własne drwiny. Jeśli nie zostaną usunięte, następny test jednostkowy będzie używał niewłaściwych prób. W kodzie IDisposable.Dispose znajduje się kod narzędzia Ioc, który usuwa wszystkie komponenty. – Antineutrino