【问题标题】:Does the ViewModelLocator in MVVM light hold instances in memory for every ViewModel?MVVM light 中的 ViewModelLocator 是否在内存中为每个 ViewModel 保存实例?
【发布时间】:2017-08-25 08:27:41
【问题描述】:

我正在开发一个相当大的软件,其中包含 100 多个对话框。我们正在考虑 MVVM 灯,但我刚刚阅读了一篇旧文章,其中指出“所有 ViewModel 都保留在内存中,直到调用 cleaup”。 所以我的问题:

  • 这是否意味着在加载时它将加载程序中的所有 ViewModel?
  • 如果默认加载全部,我可以将其更改为仅在打开对话框时加载/实例化 ViewModel 吗?

文章是Abkürzung zum ViewModel。抱歉,这是 2008 年的德语版本,您需要注册才能阅读。但我的问题只是关于那句话,所以你可以忽略它。

我已阅读this question,它提供了很多信息,但我并没有真正找到我的问题的答案。

【问题讨论】:

  • 不,它不会加载程序中的所有ViewModel
  • AFAIK,ViewModel 被延迟加载。但是一旦加载,它们会一直保留到清理完毕。
  • 我认为一个简单的实验,只需不到一个小时的编码,就可以证明这一点。
  • 它是开源的。看看源代码,你就会知道幕后发生了什么

标签: c# mvvm mvvm-light


【解决方案1】:

这是由mvvmlightnugetting创建的默认ViewModelLocator 类。

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        ////if (ViewModelBase.IsInDesignModeStatic)
        ////{
        ////    // Create design time view services and models
        ////    SimpleIoc.Default.Register<IDataService, DesignDataService>();
        ////}
        ////else
        ////{
        ////    // Create run time view services and models
        ////    SimpleIoc.Default.Register<IDataService, DataService>();
        ////}

        SimpleIoc.Default.Register<MainViewModel>();
    }

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

除非将其放入该类中,否则在该类中创建任何视图模型并没有什么神奇之处。默认情况下,涉及到一个ServiceLocator,您可以将其删除并替换为您选择的任何 DI 容器,或者手动实例化由该ViewModelLocator 处理的 ViewModel。

static Cleanup() 默认情况下不被调用,您必须在任何您喜欢的地方拨打电话,以便随时拨打电话。如果需要,这完全取决于您。

结论ViewModelLocator 将如何运作和表现完全取决于您

回答您的问题:

  • 这是否意味着在加载时它将加载程序中的所有 ViewModel?

不,除非您编写可以这样做的代码

  • 如果默认加载全部,我可以将其更改为仅在打开对话框时加载/实例化 ViewModel 吗?

(见上文)

【讨论】:

  • 嗯,但是在其中使用 SimpleIoc Containers,Viewmodels 会被懒惰地创建,对吧?至少我是这么认为的。
  • 我自己做了一个快速研究:有void Register<TInterface, TClass>( bool createInstanceImmediately ) 可以强制立即创建。所以我猜默认是懒惰的(据我阅读,文档没有明确说明)。
  • 正如我所说:您可以手动创建实例或委托给您选择的任何 DI 容器 => 一切都在您的控制之下
  • 没有规则何时调用该方法。我想在大多数情况下它永远不会被调用。所以别管它,除非你遇到这种方法很方便的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多