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