Я думаю, что это то, о чем люди на самом деле не знают при работе с контейнером Windsor - особенно часто удивительное поведение , когда одноразовые переходные компоненты удерживаются контейнером для время жизни ядра, пока оно не будет уничтожено, пока вы не выпустите их самостоятельно - хотя это задокументировано - посмотрите здесь - но быстро процитируйте:
MicroKernel имеет сменную политику выпуска, которая может подключать и реализовывать некоторые
маршрутизация для утилизации компонентов. MicroKernel поставляется с тремя реализациями IReleasePolicy:
- AllComponentsReleasePolicy: отслеживание всех компонентов для обеспечения правильного удаления при утилизации экземпляра MicroKernel
- LifecycledComponentsReleasePolicy: отслеживать только компоненты, связанные с жизненным циклом вывода из эксплуатации
- NoTrackingReleasePolicy: не выполняет отслеживание
Вы также можете реализовать собственную политику выпуска, используя интерфейс IReleasePolicy.
Что может показаться более простым, так это изменить политику на NoTrackingReleasePolicy и затем самостоятельно утилизировать - это также потенциально рискованно, но если ваш образ жизни в основном временный (или если ваш контейнер утилизировать ваше приложение все равно будет закрыто) это, вероятно, не имеет большого значения. Помните, однако, что любые компоненты, которые уже были введены синглтоном, будут содержать ссылку, так что вы можете в конечном итоге вызвать проблемы, пытаясь «обновить» свои синглтоны - это кажется плохой практикой, и мне интересно, возможно, вам удастся избежать необходимости Сделайте это в первую очередь, улучшив способ объединения ваших приложений.
Другие подходы состоят в том, чтобы создать собственный жизненный цикл с собственной реализацией вывода из эксплуатации (поэтому выпуск синглтона фактически избавился бы от компонента, так же как и переходный жизненный цикл).
В качестве альтернативы другой подход заключается в том, чтобы оформитель для вашей службы был зарегистрирован в контейнере с одноэлементным образом жизни, но ваша действующая базовая служба зарегистрирована в контейнере с переходным образом жизни - тогда, когда вам нужно обновить компонент, просто избавьтесь от переходного процесса. базовый компонент, удерживаемый декоратором, и замена его на недавно разрешенный экземпляр (разрешите его с помощью ключа компонентов, а не службы, чтобы избежать получения декоратора) - это позволяет избежать проблем с другими одноэлементными службами (которые не обновляются) от удержания устаревших сервисов, которые были использованы для того, чтобы сделать их непригодными для использования, но для их работы требуется немного кастинга и т. д.