Я пишу приложение WPF, которое использует MEF в .Net 4. У моего приложения есть CompositionContainer, к которому обращаются все мои модели представлений, чтобы получить доступ (используя MEF) к некоторым общим объектам, которые отвечают за поиск данных ихранилище.
Я использовал профилировщик памяти, чтобы посмотреть на время жизни некоторых из моих объектов модели представления, а также объектов доступа к данным, чтобы увидеть, когда все собирается мусором.К моему удивлению, я обнаружил, что CompositionContainer моего приложения сохранял ссылку на мои модели представлений после того, как они уже были удалены.
Ниже приведена моя попытка примерно показать, как я использую MEF.Я надеюсь, что кто-то может показать мне, как я делаю это неправильно.
Код в App.xaml.cs
public partial class App : Application
{
private static CompositionContainer _container;
internal static CompositionContainer Container { get { return _container; } }
private void OnStartup(object sender, StartupEventArgs e)
{
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
_container = new CompositionContainer(catalog);
}
}
Контрактный интерфейс
открытый интерфейс ICostCentreService: IBaseEntityService {...}
Экспортированный класс, реализующий интерфейс
[PartCreationPolicy (CreationPolicy.Shared)] [Экспорт (typeof)(ICostCentreService))] открытый класс CostCentreService: BaseEntityService, ICostCentreService {...}
мой класс модели представления
открытый класс CostCentreViewModel: ViewModelBase {[Import] private ICostCreSS_costCentreService;
public CostCentreViewModel()
{
App.Container.ComposeParts(this);
}
}
Надеемся, что приведенный выше фрагмент кода достаточно нарисовать, чтобы показать, как я использую MEF.Проблема возникает после того, как я закончу использовать модель представления, и я вызываю Dispose и удаляю все ссылки на нее, он не собирает мусор, потому что контейнер приложения все еще ссылается на него.(В случае, если у меня на экране в данный момент, профилировщик памяти говорит, что на мою модель представления все еще ссылается App._containner._partExportProvider._parts._items [0] ._ cashedIntance).
Итак, яинтересно как мне избавиться от этой ссылки.Я правильно не использую MEF?
Любая помощь будет высоко ценится.
Приветствия,
Ник Барретт