MEF сохраняет ссылки на части NonShared IDisposable, не позволяя собирать их с помощью GC

Я столкнулся с некоторой проблемой в времени жизни части MEF, которая вызывает утечки памяти в моем приложении Prism.

Мое приложение экспортирует представления и модели представления с PartCreationPolicy , установленным на CreationPolicy.NonShared . Представления и модели представления наследуются от ViewBase и ViewModelBase соответственно, которые реализуют IDisposable .

Теперь, поскольку мои части реализуют IDisposable , ссылка на них сохраняется в контейнере, из-за чего они не освобождаются сборщиком мусора.Согласно документации MEF о сроке службы детали , это сделано намеренно:

Контейнер не будет содержать ссылки на детали, которые он создает, если не выполняется одно из следующих условий:

  • Деталь помечена как ] Shared
  • Часть реализует IDisposable
  • Один или несколько операций импорта настроены для разрешения перекомпоновки

Как тогда я могу сделать так, чтобы MEF не сохранял ссылку на эти части? Есть ли атрибут, который я могу использовать, чтобы сообщить MEF, что я не хочу, чтобы он сохранял ссылку на мою часть, даже если он реализует IDisposable ?

Обе стратегии, обсуждаемые в приведенной выше статье, не действуют. Мне кажется, что это хорошее решение:

  • ReleaseExport требует в качестве параметра объекта Export , который я не знаю, как предоставить. У меня есть экземпляр моего представления, но я не могу узнать, какой контракт использовался для создания представления. Было бы здорово, если бы была перегрузка для ReleaseExport , которая могла бы получить любой объект, созданный контейнером.
  • Использование дочернего контейнера тоже не кажется естественным вариантом.

Любая помощь будет принята с благодарностью.

12
задан Adi Lester 9 January 2012 в 19:53
поделиться