Это то, о чем я думаю, люди не осознают при работе с контейнером Windsor - особенно часто удивительно поведения, когда одноразовые переходные компоненты удерживаются контейнером для время жизни ядра до его утилизации, если вы не выпустите их самостоятельно - хотя это задокументировано - посмотрите здесь, но если кратко процитировать:
MicroKernel имеет подключаемую политику выпуска, которая может подключать и реализовывать некоторую маршрутизацию для удаления компонентов. MicroKernel поставляется с тремя реализациями IReleasePolicy:
- AllComponentsReleasePolicy: отслеживайте все компоненты, чтобы обеспечить правильную утилизацию после удаления экземпляра MicroKernel.
- LifecycledComponentsReleasePolicy: отслеживать только компоненты, связанные с жизненным циклом вывода из эксплуатации.
- NoTrackingReleasePolicy: не отслеживает
Вы также можете реализовать свою собственную политику выпуска с помощью интерфейса IReleasePolicy.
Возможно, вам будет проще изменить политику на NoTrackingReleasePolicy, а затем заняться утилизацией самостоятельно - это тоже потенциально рискованно, но если ваш образ жизни в значительной степени временен (или если ваш контейнер утилизируется, ваш приложение все равно закрывается) это, вероятно, не имеет большого значения. Однако помните, что любые компоненты, которые уже были введены синглтоном, будут содержать ссылку, поэтому вы можете в конечном итоге вызвать проблемы, пытаясь обновить свои синглтоны - это кажется плохой практикой, и мне интересно, возможно, вы сможете избежать этого. в первую очередь за счет улучшения компоновки ваших приложений.
Другие подходы состоят в том, чтобы создать собственный жизненный цикл с собственной реализацией вывода из эксплуатации (таким образом, выпуск синглтона фактически уничтожит компонент, как это делает переходный жизненный цикл).
В качестве альтернативы другой подход состоит в том, чтобы декоратор для вашей службы был зарегистрирован в контейнере с одноэлементным образом жизни, но ваша фактическая базовая служба, зарегистрированная в контейнере с временным образом жизни, - тогда, когда вам нужно обновить компонент, просто удалите временный базовый компонент, удерживаемый декоратором и замените его только что разрешенным экземпляром (разрешите его с помощью ключа компонентов, а не службы, чтобы избежать получения декоратора) - это позволяет избежать проблем с другими одноэлементными службами (которые не обновляются) от удержания устаревших службы, которые были удалены, чтобы сделать их непригодными для использования, но для их работы требуется небольшое преобразование и т. д.
person
Bittercoder
schedule
03.10.2008