Castle Windsor: Будет ли мой временный компонент собирать мусор? - PullRequest
6 голосов
/ 23 февраля 2009

Используя Castle Windsor, у меня есть компонент, настроенный с переходным образом жизни:

<component id="publish.mapping.default"
                   service="IMyService, MyAssembly"
                   type="MyServiceImplementation, Myassembly" 
                   lifestyle="transient" />

Что будет использоваться так:

var service = container.Resolve<IMyService>(componentId);
// service usage ....
// service goes out of scope ... 

У меня вопрос: будет ли экземпляр службы собирать мусор после того, как он выйдет из области видимости, или Castle Windsor сохранит ссылку? Я обнаружил этот похожий вопрос , что подразумевает, что последний может иметь место, но после изучения размещенных там ссылок я не уверен, идет ли речь о сохранении ссылки или о том, что объект расположены, если он реализует IDisposable. Мои объекты не нужно утилизировать.

Если Касл Виндзор держится за экземпляр, есть ли простой способ предотвратить это (возможно, с помощью конфигурации)?

РЕДАКТИРОВАТЬ
Кажется, мне нужно установить политику отслеживания релизов. Может ли это быть настроено в конфигурационном файле xml, или это должно быть установлено в коде? Можно ли установить политику отслеживания релизов для каждого компонента?

Ответы [ 2 ]

9 голосов
/ 23 февраля 2009

По умолчанию контейнер содержит ссылку на ваши объекты (даже временные).

Однако, как отмечает @Bittercoder в Почему Castle Windsor удерживает временные объекты? , вы можете изменить политику отслеживания релизов . Кажется, что выбор

LifecycledComponentsReleasePolicy:

var policy = container.Kernel.ReleasePolicy;
container.Kernel.ReleasePolicy = LifecycledComponentsReleasePolicy;

Но поскольку вопрос был задан, похоже, он стал политикой по умолчанию.

1 голос
/ 25 марта 2009

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

...