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