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就不会初始化IService1IService2(因为MEF没有初始化它,我初始化了)。

(2) 问题2,当我不使用我的其他ViewModel时,它们仍然存在于内存中,因为我用MEF导入了它们,这意味着它们的状态也都在那里,也意味着大型集合正在吞噬我的内存。当你不再使用ViewModel时,你如何完全摆脱它?

看,在我使用MEF之前,我会做以下操作:

CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(new MyBar());
etc.

这意味着,当我在执行CollectionOfViewModels.Clear();的同时执行下一组ViewModel时,集合中的任何ViewModel都不再被引用,GC会收集它们。就目前的情况来看,这样做实际上并没有消除任何ViewModels。

MEF-如果我';m使用MEF?此外,我如何避免记忆问题

您熟悉MEF的ExportFactory功能吗?它允许你创建一个导出的新实例,并在完成后释放它。这听起来就像你想在这里做的。