Замок Виндзор - Должен ли я выпускать одноразовые или одноразовые временные объекты? - PullRequest
11 голосов
/ 26 июля 2010

Castle wiki говорит, что в нескольких местах я должен ВСЕГДА вызывать container.Release () для компонентов, разрешенных через контейнер.Это, очевидно, имеет смысл для сложных методов управления жизненным стилем (например, LifeStyle.Pooled) или при использовании специализированных средств ...

Но действительно ли я должен выпускать синглтон (который действует, пока контейнер не будет утилизирован)) и не одноразовые временные объекты? Если я выполняю вызовы Release () для временных объектов или синглетонов, эти вызовы кажутся излишними - например, в случае временных объектов, не реализующих IDisposable, ядро ​​просто замечает, что оно не имеетотслеживание объекта и возврат ...

Кажется, что существует понятие "компонента нагрузки" для отслеживания "косвенных" ссылок на другие одноразовые компоненты, которые могут быть созданы при разрешении переходного объекта.Я понимаю, что необходимо освобождать временные объекты, если вы не знаете на 100%, имеют ли они такие косвенные зависимости или нет.Является ли это основной причиной, призывающей всех пользователей Castle ВСЕГДА выпускать компоненты?

1 Ответ

21 голосов
/ 26 июля 2010

Castle Wiki здесь немного строгий - старается быть в безопасности, а не сожалеть.Вероятно, он мог бы использовать некоторую переписку.

В любом случае - вот как это работает.

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

Теперь вот часть, где наступают времена жизнив игру.

  • Singleton - по определению, singleton являются «глобальными» в контексте контейнера - они создаются при первом запросе и живут до конца срока службы контейнера.(что означает, пока контейнер не будет утилизирован).Если вы видите документацию, это фактически говорит о том, что выпуск синглетонов на самом деле ничего не делает.Только когда контейнер будет утилизирован, будут вызваны проблемы вывода из эксплуатации ваших компонентов времени жизни.

  • Per (контекст: веб-запрос / сеанс WCF /) - поскольку объект используется совместно в скважинеопределенный контекст с четко определенным концом, конец контекста позаботится о высвобождении ваших компонентов.

  • Переходный процесс - вот где реальные проблемы могут закрасться. Поскольку временные компоненты не имеютлюбой конец, произвольный конец жизни, и вы можете создать кучу их экземпляров в течение срока службы приложения, нет другого способа, кроме как быть явным и сказать контейнеру: «Эй, я больше не буду использовать этот объект, не стесняйтесь получатьизбавимся от этого, спасибо за всю рыбу. "

Теперь причина, по которой в документации предлагается всегда выпускать компоненты, заключается в том, что код, использующий компоненты, не должен знать, каков срок службыКомпонентЭто не всегда так, и часто в приложениях присутствуют компоненты, которые «естественно» соответствуют образу жизни.В целом, однако, как я уже сказал, речь идет о безопасности, а не сожалении.

Другое дело, когда вы звоните Resolve и Release.Вы должны только когда-либо Release что вы Resolve.

Когда вы используете контейнер аналогично тому, как я это делаю , вам, возможно, не придется звонить Release где-либо вваш код.Вы получите Resolve свой корень, но Dispose самого контейнера позаботится о его освобождении.Скорее всего, вы также будете разрешать другие компоненты неявным образом через типизированные фабрики, и в этом случае вы также должны освободить их (через фабрику), но это обычно так.

Таким образом, конечный результат,это не так страшно, как кажется на первый взгляд.

...