问题描述
|
基本上,我担心两件事:
[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来进行一些处理。然后,当我加载第二组viewmodel时,Barviewmodel仍然是相同的实例(因此它的所有属性都是相同的,包括SomeObjects
属性。如何告诉它重新初始化自身,以便所有它都数据被清除了吗?如果我改为MyBar = new MyBar()
,那么MyBar不会初始化IService1
或IService2
(因为MEF没有初始化它,所以我做了)。
(2)问题2,当我不使用其他viewmodel时,它们仍驻留在内存中,因为我是通过MEF导入它们的,这意味着它们的状态也都存在,这意味着大量大型收藏品正吞噬着我记忆。当您不再使用viewmodel时,如何完全摆脱它呢?
在使用MEF之前,请先执行以下操作:
CollectionOfviewmodels.Clear();
CollectionOfviewmodels.Add(new MyBar());
etc.
这意味着当我做完下一个viewmodels集时,立即“ 6”不再再引用该集合中的任何viewmodel,并且GC会收集它们。就目前而言,这样做实际上并没有摆脱任何viewmodel。
解决方法
您是否熟悉MEF的
ExportFactory
功能?它允许您创建导出的新实例,并在完成后释放它。这听起来像您想要在这里做的。