2009-06-16 8 views
1

Le test d'unité ci-dessous échoue et je cherche une raison valable de le faire.Castle Windsor: Le réenregistrement d'un composant nommé maintient le style de vie précédent

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"); 
} 

Même si le composant a été retiré du conteneur, il semble qu'une référence au LifeStyle est maintenue par son nom. J'utilise la version 2.0.

+0

Veuillez le signaler à la liste des utilisateurs ou à donjon (http://www.castleproject.org/issuetracker.html) –

Répondre

1

Krzysztof a raison, cela ressemble à un bug.

La raison est que la configuration du composant, qui contient le style de vie, est et non supprimée par RemoveComponent, donc la première configuration de style de vie sera toujours utilisée.

Solution: ajoutez cette ligne après l'appel RemoveComponent():

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

S'il vous plaît rapport au suivi des problèmes (y compris votre testcase) et un lien ici, cela pourrait servir de point de départ pour corriger le bug .

+0

Merci pour la solution de contournement, peut confirmer que cela fonctionne. Signalez comme un bug comme conseillé. – crowleym

+0

Rapport de bogue: http://support.castleproject.org/projects/IOC/issues/view/IOC-ISSUE-160 Connecté en utilisant OpenID, et il semble avoir enregistré comme signalé par un autre compte (jsimons) .. .mais il n'en est pas moins le rapport qui découle de ce post. – crowleym

Questions connexes