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