Castle Wiki здесь немного строгий - старается быть в безопасности, а не сожалеть.Вероятно, он мог бы использовать некоторую переписку.
В любом случае - вот как это работает.
Виндзор (по умолчанию) отслеживает большинство компонентов и содержит ссылку на них, что не позволяет сборщику мусора собирать их.Это не ошибка - это особенность, и чрезвычайно полезная и мощная.В большинстве случаев вы не должны предполагать, будет ли отслеживаться компонент или нет.Не одноразовый компонент, который имеет одноразовые зависимости, также будет отслеживаться.В общем случае это правило: « компоненты, которые сами по себе или в некоторых из своих зависимостей имеют какие-либо шаги по выводу из эксплуатации, отслеживаются политикой выпуска по умолчанию в Виндзоре ».
Теперь вот часть, где наступают времена жизнив игру.
Singleton - по определению, singleton являются «глобальными» в контексте контейнера - они создаются при первом запросе и живут до конца срока службы контейнера.(что означает, пока контейнер не будет утилизирован).Если вы видите документацию, это фактически говорит о том, что выпуск синглетонов на самом деле ничего не делает.Только когда контейнер будет утилизирован, будут вызваны проблемы вывода из эксплуатации ваших компонентов времени жизни.
Per (контекст: веб-запрос / сеанс WCF /) - поскольку объект используется совместно в скважинеопределенный контекст с четко определенным концом, конец контекста позаботится о высвобождении ваших компонентов.
Переходный процесс - вот где реальные проблемы могут закрасться. Поскольку временные компоненты не имеютлюбой конец, произвольный конец жизни, и вы можете создать кучу их экземпляров в течение срока службы приложения, нет другого способа, кроме как быть явным и сказать контейнеру: «Эй, я больше не буду использовать этот объект, не стесняйтесь получатьизбавимся от этого, спасибо за всю рыбу. "
Теперь причина, по которой в документации предлагается всегда выпускать компоненты, заключается в том, что код, использующий компоненты, не должен знать, каков срок службыКомпонентЭто не всегда так, и часто в приложениях присутствуют компоненты, которые «естественно» соответствуют образу жизни.В целом, однако, как я уже сказал, речь идет о безопасности, а не сожалении.
Другое дело, когда вы звоните Resolve
и Release
.Вы должны только когда-либо Release
что вы Resolve
.
Когда вы используете контейнер аналогично тому, как я это делаю , вам, возможно, не придется звонить Release
где-либо вваш код.Вы получите Resolve
свой корень, но Dispose
самого контейнера позаботится о его освобождении.Скорее всего, вы также будете разрешать другие компоненты неявным образом через типизированные фабрики, и в этом случае вы также должны освободить их (через фабрику), но это обычно так.
Таким образом, конечный результат,это не так страшно, как кажется на первый взгляд.