Временный компонент, использующий компонент PerWebRequest, когда компонент PerWebRequest выходит из области видимости?
Я пытаюсь разобраться в несколько сложном сценарии. В основном, если у меня есть класс X
который зарегистрирован в замке как LifestyleTransient()
:
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
позвонить вообще?!
Примечание. Это несколько упрощенный пример, мой реальный пример гораздо более сложный и включает MVC ControllerFactory и различные другие технологии, но вопрос в простейшей форме сводится к вышесказанному.
1 ответ
После небольшого количества экспериментов получается следующее:
Dispose()
будет вызванDispose
вызывается в конце веб-запроса- Если несколько переходных
X
s созданы и выпущеныDispose
называется только (наY
) один раз в конце веб-запроса. Не тогда, когда освобождаются временные объекты-контейнеры
Предостережения
Я пришел к такому выводу, отладив Dispose
метод и т. д. Я предполагаю, что отладка не повлияла на то, как это выполняется. Я не нашел какой-либо убедительной документации о том, как это должно работать, и приветствовал бы кого-нибудь, кто нашел бы это?
Моя реализация немного отличалась от описанной в вопросе, я предположил, что Виндзор должен знать, был ли интерфейс IDispoable
или нет, так IY
похоже:
interface IY : IDisposable
Я не проверял, уместно ли это (если оно не сломалось, не исправляйте его).