1

J'essaie de donner un sens à un scénario un peu compliqué. En gros, si je classe X qui est enregistré dans le château comme LifestyleTransient():composante transitoire en utilisant un composant PerWebRequest, quand est la composante PerWebRequest hors de portée?

Component.For<IX>() 
.ImplementedBy<X>() 
.LifestyleTransient() 

X ressemble à quelque chose comme:

public X : IX 
{ 
    private IY _y; 
    public X(IY y) 
    { 
     _y = y; 
    } 
    .... 
} 

et Y est inscrit ainsi:

Component.For<IY>() 
.ImplementedBy<Y>() 
.LifestylePerWebRequest() 

et ressemble à:

public Y : IY, IDisposable 
{ 
    private Object obj; 
    public Y() 
    { 
     obj = new Object(); 
    } 

    public void Dispose() 
    { 
     obj.Dispose(); 
    } 
} 

Si je crée une instance de X et Release il:

WindsorContainer Container; 
IX x = Container.Resolve<IX>(); 
Container.Release(x); 

quand est Dispose obtenir appelé sur Y? Est-ce à la fin de la requête Web ou lorsque l'instance de x est libérée? Est-ce que Dispose est appelée du tout ?!


Note: Ceci est un exemple un peu converluted, mon exemple réel est beaucoup plus complexe et invloves un MVC ControllerFactory et d'autres pièces de la technologie, mais la question se résume assez bas au-dessus de sa forme plus simple .

Répondre

1

Avec un peu d'expérimentation est apparaît ce qui suit est vrai:

  • Dispose() sera appelé
  • Dispose est appelé à la fin de la requête Web
  • Si sont créés plusieurs X s transitoires et publié Dispose est seulement appelé (sur Y) une fois à la fin de la requête Web. Pas quand les objets conteneurs transitoires sont libérés

Avertissements

Je suis venu à cette conclusion par la méthode mise au point Dispose, etc. Je me présumant le débogage cela n'a pas fait aucun effet sur comment cela fonctionne. Je n'ai pas trouvé de documentation concluante sur la façon dont cela est censé fonctionner et souhaiterais que quelqu'un qui trouve cela?

Ma mise en œuvre a été légèrement différente de celle de la question, je devinais que Windsor aurait besoin de savoir si l'interface était IDispoable ou non, si IY ressemble à:

interface IY : IDisposable 

Je ne l'ai pas testé si cela est pertinent (s'il n'est pas cassé, ne le répare pas).