2012-02-29 12 views
8

Tengo IWindsorContaner que existe para toda la vida útil de la aplicación. Para Unittest es posible registrar mocks/stubs, etc. bajo su Type. Cuando finaliza la prueba y se desecha el accesorio, los componentes registrados en la prueba se eliminan con un método creado por sí mismo llamado "Anular el registro".¿Cómo se eliminan los componentes con Castle 3.0?

Ahora, quiero actualizar a la última versión de Castle que es 3.0. De acuerdo con la versión 3.0 señala algo así como

public void Unregister(string contextName, string registrationName) 
{ 
    IWindsorContainer context = GetOrCreateContext(contextName); 
    context.Kernel.RemoveComponent(registrationName); 
} 

ya no es posible, ya que el método IKernel.RemoveComponent se ha eliminado. La descripción para corregir esto no es realmente suficiente ("Intenta utilizar IHandlerSelectors").

una versión simplificada del aparato que utilizo para 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())); 
    } 

}

¿Cómo puedo eliminar los componentes con el castillo de 3.0?

Respuesta

2

En lugar de intentar eliminar todos los componentes, simplemente cree un nuevo IWindsorContainer y vincúlelo a lo que GetOrCreateContext esté comprobando. Entonces tendrás un contenedor nuevo y fresco que no tiene nada que ver con eso.

+2

Por supuesto, esto funcionaría. Pero esto también requeriría muchos cambios de código en muchos proyectos de software dependientes. Encontré una solución al colocar un objeto de soporte en el contenedor en lugar del real. Pero cuanto más pienso en ello, Castle realmente no parece ser el contenedor correcto de IoC para los unittest, ¿verdad? – Antineutrino

+0

Para todas las pruebas unitarias que he escrito hasta este punto, Castle ha sido exactamente el contenedor de IoC perfecto para las pruebas unitarias. ¿Por qué necesita borrar todas las entidades registradas de todos modos? – eouw0o83hf

+1

Porque cada prueba unitaria registra sus propios simulacros. Si no se eliminan, la próxima prueba de la unidad usaría los simulacros incorrectos. Entonces, hay un código en el método IDisposable.Dispose del dispositivo de prueba Ioc que elimina todos los componentes. – Antineutrino

Cuestiones relacionadas