Я столкнулся с некоторой проблемой во время жизни части MEF, которая вызывает утечку памяти в моем приложении Prism.
Мое приложение экспортирует представления и модели представления, при этом для параметра PartCreationPolicy
установлено значение CreationPolicy.NonShared
. Представления и модели представления наследуются от ViewBase
и ViewModelBase
соответственно, что реализует IDisposable
.
Теперь, поскольку мои части реализуют IDisposable
, ссылка на них хранится в контейнере, из-за чего они не освобождаются сборщиком мусора. Согласно документации MEF по сроку службы детали, это предусмотрено замыслом:
Контейнер не будет содержать ссылки на создаваемые им части, если не выполняется одно из следующих условий:
- Деталь отмечена как
Shared
- Часть реализует
IDisposable
- Один или несколько импортов настроены на рекомпозицию
Как же тогда сделать так, чтобы MEF не хранил ссылки на эти части? Есть ли атрибут, который я могу использовать, чтобы сообщить MEF, что я не хочу, чтобы он сохранял ссылку на мою часть, даже если он реализует IDisposable
?
Обе стратегии, рассмотренные в статье выше, не кажутся мне хорошими решениями:
ReleaseExport
требует объектExport
в качестве параметра, который я не знаю, как предоставить. У меня есть экземпляр моего представления, но я не могу узнать, какой контракт использовался для создания представления. Было бы здорово, если бы была перегрузка дляReleaseExport
, которая могла бы получать любой объект, созданный контейнером.- Использование дочернего контейнера также не кажется естественным вариантом.
Любая помощь будет оценена.