2011-01-03 4 views
0

EDIT:Château de Windsor Composants Releasing

J'ai terminé reformulé la question comme je l'ai été en mesure de simplifier mon problème à ce qui suit:

 var container = new WindsorContainer(); 

     container.Register(Component.For<IFoo>().ImplementedBy<Foo>().LifeStyle.Singleton); 
     var foo = container.Resolve<IFoo>(); 
     container.Kernel.ReleaseComponent(foo); 
     var foo2 = container.Resolve<IFoo>(); 

     Assert.IsTrue(foo != foo2) // this fails 

public interface IFoo : IDisposable { } 

public class Foo : IFoo { 
    public void Dispose() 
    { 

    } 
} 

Je dois faire quelque chose vraiment stupide ... aucune idée quoi?

Fondamentalement, ce que j'essaye d'accomplir ici est que toutes les résolutions d'un composant retournent la même instance pendant un certain temps (une portée). S'il y a une meilleure façon d'accomplir cela, je suis certainement ouvert à cela.

EDIT: Ok, donc je RTFM et apparemment c'est par conception. Est-ce la meilleure façon d'accomplir ce que je veux ici encore un gestionnaire de style de vie personnalisé?

Merci.

+1

oui, si c'est le comportement que vous voulez, puis style de vie personnalisé, il doit être –

+0

Merci. J'ai ajouté une classe personnalisée héritant de AbstractLifestyleManager pour ce faire, mais Release n'est jamais appelée lorsque j'appelle ReleaseComponent. Il semble que Release ne soit appelée que si le ReleasePolicy.HasTrack du noyau renvoie true, mais cela ne se produit pas pour tous les composants ... Pourriez-vous nous conseiller? Merci. – Jeff

Répondre

3

Votre Foo est PerThread. Cela signifie que vous obtiendrez une nouvelle instance ... si vous le demandez sur un autre thread. Si je vous comprends bien, le problème est lié au mode de vie que vous avez choisi, et non à la manière dont vous libérez des composants.

+0

Désolé, je suppose que je n'expliquais pas clairement. J'ai toujours le même problème si c'est un singleton. Je pense que le problème est que le Func injecté dans MyType contient une liste des "instances résolues" en interne et n'appelle pas container.Resolve en interne chaque fois que j'appelle le Func. En conséquence, je peux 1. Invoquer le Func et récupérer une instance. 2. Avoir quelqu'un d'autre sur le fil, ou n'importe où si Singleton, utiliser alors appelez .Dispose sur cette instance. 3. L'instance est supprimée du conteneur, mais les appels suivants au même Func renvoient l'instance éliminée au lieu d'une nouvelle ... – Jeff

+0

Exemple supplémentaire. Merci pour l'aide. – Jeff

Questions connexes