Почему замок Виндзор держится за временные объекты?

Недавно я заметил, что мое приложение, похоже, есть память, которая никогда не выпускается. После профилирования с помощью CLRProfiler я обнаружил, что контейнер Castle Windsor, который я использую, удерживает объекты. Эти объекты объявляются с атрибутом lifestyle = "переходный" в config xml.

Я обнаружил, что если я ставлю явный вызов IWindsorContainer.Release(hangingObject), он поместит его ссылки.

Это вызывает проблему, хотя я не ожидал, что с помощью объекта временного образа жизни CastleWindsor сохранит ссылку и эффективно создаст утечку. Это будет довольно обыденная задача, связанная с ошибкой, которая собирается вставлять явные вызовы Release во всех соответствующих местах.

Вы видели эту проблему, и есть ли у вас какие-либо предложения о том, как обойти ее?

Ответ 1

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

Во многих сценариях, особенно в тех случаях, когда ваш контейнер существует на протяжении всего срока действия приложения-хостинга, и где переходные компоненты действительно не нужно отслеживать (поскольку вы обрабатываете удаление в своем кодовом коде или компоненте, который был введен с помощью службы), то вы можете просто установить политику выпуска в реализацию NoTrackingReleasePolicy и сделать с ней.

До замка v 1.0 я верю, что компонентное бремя будет внедрено/внедрено - что поможет облегчить некоторые из этих проблем, а также об утилизации вложенных зависимостей и т.д.

Edit:

Ознакомьтесь со следующими сообщениями, чтобы узнать больше о нагрузке на компонент.

Компонентное бремя - Дэви Брионс

Также компонентная нагрузка реализуется в официальном выпуске 2.0 в контейнере Windsor.

Ответ 2

Следует отметить, что это, по-видимому, было зафиксировано в Замковой башне. В r5475 Хамметт изменил политику выпуска по умолчанию в MicroKernel на LifecycledComponentsReleasePolicy.

Ответ 3

Вы можете установить образ жизни одиночного или переходного, но на объекты в контейнере. Синглтон-объекты, которые, как я понимаю, должны длиться всю жизнь приложения, но я не понимаю, насколько полезность этого поведения одинакова для переходных!

Пользовательский образ жизни может быть создан путем реализации ILifestyleManager. Возможно, это возможно реализовать таким образом, чтобы создать стиль стиля ReallyTransient!