Zdarzyło mi się trochę problemów w czasie życia części MEF, które powoduje wycieki pamięci w mojej aplikacji Prism.MEF zachowuje referencje dla niepoznawanych części IDisposable, nie pozwalając na ich zbieranie przez GC
Moja aplikacja eksportuje widoki i modele widoków z ustawieniem PartCreationPolicy
na CreationPolicy.NonShared
. Widoki i modele widoku dziedziczą odpowiednio od ViewBase
i ViewModelBase
, która implementuje IDisposable
.
Teraz, ponieważ moje części implementują IDisposable
, odniesienie do nich jest przechowywane przez kontener, co powoduje, że nie są one zwalniane przez pojemnik na śmieci. Według MEF documentation on part lifetime, to jest zgodne z projektem:
Pojemnik nie będzie posiadać odniesienia do części to stwarza chyba jeden z następujących warunków:
- część jest oznaczona jako
Shared
- Część implementuje
IDisposable
- Jeden lub więcej import jest skonfigurowany tak, aby umożliwić Rekompozycja
Jak mogę sprawić, aby MEF nie odwoływał się do tych części? Czy jest jakiś atrybut, którego mogę użyć, aby poinformować MEF, że nie chcę, aby utrzymywał odniesienie do mojej części, nawet jeśli implementuje ona IDisposable
?
Obie strategie omówione w powyższym artykule nie wydaje się dobre rozwiązania dla mnie:
ReleaseExport
wymaga obiektuExport
jako parametr, który nie wiem jak zapewnić. Mam instancję mojego poglądu, ale nie ma sposobu, aby dowiedzieć się, jaki był kontrakt, który został użyty do stworzenia poglądu. Byłoby wspaniale, gdyby istniało przeciążenie dlaReleaseExport
, które mogłoby odbierać dowolny obiekt utworzony przez kontener.- Używanie kontenera podrzędnego również nie wydaje się być naturalnym rozwiązaniem.
Każda pomoc zostanie bardzo doceniona.
Dziękuję za odpowiedź i za powitalną wiadomość. Sądzę, że integracja z Prismem wraz z 'ExportFactory' jest właściwą drogą, choć wydaje się, że przesada jest prosta:" nie dodawaj mnie do kontenera ". Jeszcze się nie poddałem - wciąż szukam prostszego i eleganckiego rozwiązania. –