MEF-如果使用MEF,如何创建新的ViewModel或重置其状态?另外,如何避免内存问题?

问题描述

| 基本上,我担心两件事:
[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
功能?它允许您创建导出的新实例,并在完成后释放它。这听起来像您想要在这里做的。