Временный компонент, использующий компонент 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 вызывается в конце веб-запроса
  • Если несколько переходных Xs созданы и выпущены Dispose называется только (на Y) один раз в конце веб-запроса. Не тогда, когда освобождаются временные объекты-контейнеры

Предостережения

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

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

interface IY : IDisposable

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

Другие вопросы по тегам