Почему Замок Виндзор держится на временных объектах? - PullRequest
29 голосов
/ 25 сентября 2008

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 03 октября 2008

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

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

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

Edit:

Посмотрите следующие посты для более подробного обсуждения бремени компонентов.

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

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

2 голосов
/ 25 марта 2009

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

1 голос
/ 25 сентября 2008

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

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

...