我一直在使用流行的MVVM Light工具包:here来创建我的Windows Phone应用程序,并对模式有疑问。对于每个创建的页面,我们都会创建一个新的视图模型,以使代码保持清洁并促进关注点的分离。但是,ViewModelLocator的构造函数包含每个视图模型的实例化。
ViewModelLocator的构造函数通常如下所示:
public ViewModelLocator()
{
////if (ViewModelBase.IsInDesignModeStatic)
////{
//// // Create design time view models
////}
////else
////{
//// // Create run time view models
////}
CreateMain();
CreatePage2();
CreatePage3();
CreatePage4();
}
如果某个应用程序包含一堆页面,那么即使对于那些可能永远不需要的视图也不会实例化每个ViewModel会导致性能问题吗?
我在这里错过了什么吗?
答案 0 :(得分:8)
任何开销或任何关于性能的问题,测量开销/问题是个好主意。
确实,当通过.Net,C#,Silverlight,XAML,DataBinding和MVVMLight对WP7进行编码时,你会插入大量的“开销” - 大部分开销都是为了方便编码器,而不是为了好处用户。
然而,WP7 CPU,视频协处理器,快速RAM和快速SolidState内存都非常快 - 因此存在一些开销的空间,您可以使用这些框架来创建令人愉快的,响应迅速的WP7应用程序。
无论如何都要担心性能 - 但最好通过测量来推动这些问题,找出需要优化的地方,或者需要隐藏其他UI功能背后的缓慢的地方。
一般来说,当我测量时,我发现我的性能瓶颈并不是我所期望的......我也发现总会有权衡 - 例如在您关注的情况下,权衡可能是当Locator构造代码运行较慢时,后面的查找代码可以更快地运行 - 因此应用内导航可以更快,但代价是稍微慢一点的启动时间。
答案 1 :(得分:1)
您不必显式地在构造函数中创建对象。您可以将它们推迟到第一次访问它们。
public MainPageViewModel MainPage
{
if(_mainPageViewModel == null)
{
_mainPageViewModel = CreateMain();
}
return _mainPageViewModel;
}
无论如何都要衡量@Stuart所说的性能,但通常只为你需要的东西创造足够的东西。因此,将创建推迟到属性getter是最好的。
但是,如果视图模型的收缩很重,那么您可以在构造函数中考虑upfrint构造,同时为用户提供进度条。这取决于,衡量绩效,分析您的设计,看看哪种最适合您的需求。