Castle Windsor: el nuevo registro de un componente con nombre mantiene el estilo de vida anterior

StackOverflow https://stackoverflow.com/questions/1001063

  •  05-07-2019
  •  | 
  •  

Pregunta

La prueba de unidad de abajo falla y estoy buscando una razón válida para hacerlo.

interface IFoo { }
class Foo : IFoo { }
class Foo2 : IFoo { }

[TestMethod]
public void LifestyleTest4()
{
    WindsorContainer container = new WindsorContainer();

    container.Register(Component.For<IFoo>().ImplementedBy<Foo>().Named("foo").LifeStyle.Singleton);

    IHandler h = container.Kernel.GetHandler("foo");
    Assert.IsTrue(h.ComponentModel.LifestyleType == LifestyleType.Singleton);

    bool removed = container.Kernel.RemoveComponent("foo");
    Assert.IsTrue(removed);

    container.Register(Component.For<IFoo>().ImplementedBy<Foo2>().Named("foo").LifeStyle.Transient);

    h = container.Kernel.GetHandler("foo");
    //Assert will fail as LifestyleType == Singleton
    Assert.IsTrue(h.ComponentModel.LifestyleType == LifestyleType.Transient, "Expected Transient Lifestyle");
}

Aunque el componente se eliminó del contenedor, parece que una referencia al LifeStyle se mantiene por nombre.

Estoy usando la versión 2.0.

¿Fue útil?

Solución

Krzysztof tiene razón, esto parece un error.

El motivo es que la configuración del componente, que contiene el estilo de vida, no se elimina con RemoveComponent, por lo que siempre se utilizará la primera configuración de estilo de vida.

Solución alternativa: agregue esta línea después de llamar a RemoveComponent ():

container.Kernel.ConfigurationStore.GetComponentConfiguration("foo").Attributes.Remove("lifestyle");

Por favor repórtelo al rastreador de problemas (incluya su caso de prueba) y haga un enlace aquí, esto podría servir como punto de partida para corregir el error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top