MEF-如果我';m使用MEF?此外,我如何避免记忆问题
本文关键字:此外 记忆 问题 何避免 使用 如果 MEF- MEF | 更新日期: 2023-09-27 17:57:39
基本上,我担心两件事:
[Export]
public class FooViewModel : NotificationObject
{
[Import]
public IService1 Service1 { get; set; }
[Import]
public IService2 Service2 { get; set; }
[Import]
public BarViewModel MyBar { get; set; }
etc.
//This is already initialized
public ObservableCollection<NotificationObject> CollectionOfViewModels { get; set; }
public void SetupViewModels1()
{
CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(MyBar);
CollectionOfViewModels.Add(MyOtherBar);
CollectionOfViewModels.Add(My3rdViewModel);
etc.
}
public void SetupViewModels2()
{
CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(MyBar);
CollectionOfViewModels.Add(My4thViewModel);
etc.
}
}
[Export]
public class BarViewModel : NotificationObject
{
[Import]
public IService1 Service1 { get; set; }
[Import]
public IService2 Service2 { get; set; }
//This is initialized and then the user starts adding values to it.
public ObservableCollection<Object> SomeObjects { get; set; }
public void DoSomething() { ... }
}
(1) 第1期,我加载了我的FooViewModel,一切都很好。我选择加载我的第一组ViewModel来处理它们。然后,当我加载我的第二组ViewModels时,BarViewModel仍然是同一个实例(所以它的所有属性都是相同的,包括SomeObjects
属性。你如何告诉它重新初始化自己,这样它的所有数据都会被清除?如果我改为MyBar = new MyBar()
,那么MyBar就不会初始化IService1
或IService2
(因为MEF没有初始化它,我初始化了)。
(2) 问题2,当我不使用我的其他ViewModel时,它们仍然存在于内存中,因为我用MEF导入了它们,这意味着它们的状态也都在那里,也意味着大型集合正在吞噬我的内存。当你不再使用ViewModel时,你如何完全摆脱它?
看,在我使用MEF之前,我会做以下操作:
CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(new MyBar());
etc.
这意味着,当我在执行CollectionOfViewModels.Clear();
的同时执行下一组ViewModel时,集合中的任何ViewModel都不再被引用,GC会收集它们。就目前的情况来看,这样做实际上并没有消除任何ViewModels。
您熟悉MEF的ExportFactory
功能吗?它允许你创建一个导出的新实例,并在完成后释放它。这听起来就像你想在这里做的。