1

Я пытаюсь понять несколько сложный сценарий. В принципе, если у меня есть класс X, который зарегистрирован в замке, как LifestyleTransient():Переходный компонент с использованием компонента PerWebRequest, когда компонент PerWebRequest выходит из области видимости?

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

X выглядит что-то вроде:

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

и Y зарегистрирована таким образом:

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

и выглядит следующим образом:

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

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

Если я создаю экземпляр X и Release это:

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

когда же Dispose дозвонились на Y? Это в конце веб-запроса или когда выпущен экземпляр x? Вызывает ли вообще Dispose ?!


Примечание: Это несколько converluted пример, мой фактический пример является гораздо более сложным и invloves в MVC ControllerFactory и различные другие части технологии, но вопрос довольно сводится к вышесказанному в это Простейшая форма ,

ответ

1

С немного экспериментов будет появляется справедливо следующее:

  • Dispose() будет вызван
  • Dispose вызывается в конце веб-запроса
  • Если несколько переходных X s создаются и выпущенный Dispose - это только , вызванный (по адресу Y) один раз в конце веб-запроса. Не тогда, когда переходные объекты контейнера высвобождается

предостережений

Я пришел к этому выводу отладки Dispose метода и т.д. я предполагаю меня отладки это не сделало никакое влияние на как это происходит. Я не нашел окончательной документации о том, как это должно работать, и приветствовал бы всех, кто это нашел?

Моя реализация была немного отличается, что в вопросе, я предположил, что Виндзор должен был бы знать, если интерфейс был IDispoable или нет, так IY выглядит следующим образом:

interface IY : IDisposable 

Я не проверял, если это (если он не сломался, не исправляйте его).

Смежные вопросы