Я заставляю GC провести очистку
Если MEF все еще имеет ссылки на объекты, то, очевидно, это ничего не делает. Если объекты стали мусором, то сборщик мусора автоматически соберет их - если явно попросить сделать это, это всего лишь подсказка, которую можно игнорировать. В любом случае, это не обязательно.
Я поместил в деструктор механизм ведения журнала для отслеживания, и объекты уничтожаются только после закрытия приложения. Могу ли я предположить, что MEF создал другие ссылки на эти объекты?
MEF будет содержать ссылки на созданные объекты, чтобы он мог повторно возвращать одну и ту же ссылку, когда вы запрашиваете экспорт. Чтобы попросить MEF отказаться от этих ссылок, вы должны позвонить CompositionContainer.Dispose
. Очевидно, что после этого вы больше не сможете повторно использовать контейнер, хотя можете создать новый.
MEF также является владельцем любых IDisposable
объектов, которые он создает. Это означает, что когда вы утилизируете контейнер, он вызовет Dispose
для любых таких объектов, прежде чем отказаться от ссылки.
Предпочтительно использовать вызовы Dispose
для выполнения очистки, а не использовать финализаторы. Нет никакой гарантии, что финализаторы работают вообще .
редактирование:
Мне нужно уничтожить объект после его использования. Но я не хочу уничтожать контейнер. Я хочу, чтобы MEF был фабрикой для создания новых экземпляров запрашиваемой детали, и вызывающая сторона должна быть способна уничтожить объект, когда он больше не нужен. Вы можете помочь с этим?
Для этого ExportFactory . (Ранее он назывался PartCreator
). К сожалению, он пока недоступен в .NET 4, если вы не используете Silverlight. Вы можете использовать предварительные версии codeplex , чтобы уже попробовать.
Если вы не хотите использовать предварительные выпуски MEF, вы можете реализовать что-то вроде ExportFactory
самостоятельно, создав фабричные классы, которые обертывают контейнер, и используя GetExport
и * 1041. * методы для приобретения и выпуска объектов. Не забудьте установить PartCreationPolicy
, если вам нужно создать несколько экземпляров одной детали.
изменить 2:
Я почему-то упустил, что вы уже все время используете ExportFactory
. Вам просто нужно позвонить ExportLifeTimeContext.Dispose
, когда вы закончите с объектом!