为UWP应用选择Prism还是MVVM Light?

10
我们在Windows 8.1上有一个可用的项目,现在需要将其转换为UWP应用程序。在早期的项目中,我们使用PRISM作为MVVM框架。但是对于UWP应用程序,Prism的新版本尚未发布,因此我们正在考虑使用MVVMLight。
我对这两个框架都不熟悉,并且想知道从PRISM移植代码到MVVMLight会有多难。如果很困难,我们是否应该等待Prism的新版本发布。如果我们决定转向MVVMLight,需要进行哪些重大改变。
根据我的观察,代码库与PRISM高度耦合,代码中广泛使用接口(如IResourceLoader、ISessionStateService等)。而且,我读到PRISM有一定的学习曲线,而MVVMLight则没有。因此,如果我们决定转向MVVMLight,我需要先学习PRISM以了解代码库,然后再学习MVVMLight才能移植代码库吗?如果我们决定等待本周发布的Prism新版本,是否会有重大的代码更改?
两个框架在单元测试方面的支持如何?
由于这项任务的时间不多,哪种方法最有效?

2
"代码库与PRISM高度耦合" - 我认为这是你在这里面临的最大问题。 - Mike Eason
1
你不需要一个花哨的框架来让MVVM为你工作,它只是使一些事情变得更容易实现,比如依赖注入。圣杯是允许你的代码对变化进行自适应,将层分离并将实现暴露为接口。使用花哨的框架很可能会将你与该框架绑定在一起,除非你能找到一种方法来隔离依赖项。这是一个相当庞大的主题,但我建议阅读《自适应代码》(http://www.amazon.co.uk/Adaptive-Code-via-Interface-Principles/dp/0735683204)。 - Mike Eason
谢谢Mike。我会读那本书的。你写道:“使用高级框架很可能会将你与该框架绑定,除非你能找到一种方法来隔离依赖关系。”那么你是在建议我不要使用上述两个框架吗? - Aakansha
1
虽然@MikeEason说得没错,尽量解耦代码是最好的,但你必须知道选择PRISM相比MVVM Light有一些优势。因为它包含了一些你不再需要自己编写的代码。一个例子就是在导航时将ViewModel数据保存到本地存储。所以如果你想转向另一个框架,你就需要重新编写内置功能... - Depechie
1
值得注意的是,自提出这个问题以来,UWP应用程序的Prism 6.0版本已经发布(https://github.com/PrismLibrary/Prism/releases)。 - Greg Hurlman
显示剩余3条评论
2个回答

11

简而言之:为了预期的新NuGet包,编译最新的Prism代码。

首先进行一小段介绍来让每个人都处于同一水平线上。Prism是由Microsoft Patterns & Practices创建的MVVM指导/框架。他们发布了WPF/Silverlight的版本5。此外,他们还发布了适用于Windows 8的Windows Runtime Prism,后来更新为Win8.1/WP8.1 RT。这些是两个不同的代码库,第二个更轻量级,例如区域等方面,但为应用程序生命周期管理提供了非常有用的支持。很多人错误地认为它们是相同的。

在三月份,Prism的所有权转移到了社区作为一个开源项目,并且可以在GitHub上获得。他们决定向前发展,在PCL核心程序集中合并公共代码并添加对Xamarin Forms的支持。

截至今天,尚没有UWP的Prism 6 RTM版本。代码库非常接近发布,只有几个小问题未解决,但没有阻止大多数用户使用已有的位。此时,我建议你克隆GitHub存储库,编译程序集并开始移植应用程序。有一些破坏性变化(主要是名称空间),但你应该很快就可以完成移植。一旦RTM包可用,请删除硬引用并使用NuGet。

我已经移植了我们较小的一个应用程序,并计划在本周末移植一个较大的LOB应用程序(超过60个屏幕)。

回到讨论使用哪个MVVM框架的问题。如果你的应用程序只有几个页面,不要费心使用框架,保持MVVM简单即可。如果你打算创建复杂的LOB应用程序,这些框架有它们的优势(当然也有缺点)。有很多选择(例如MVVM Light、Prism、Caliburn Micro等),它们都很好。

你的同事选择Prism可能有像Depechie提到的理由。首先,我想到的是应用程序生命周期管理方面,Prism在这方面有更出色的支持。

通过正确使用基类,你应该能够消除每个单独ViewModel的大部分依赖关系,以防万一你最终想要切换到另一个框架。

当你切换时,Prism for Windows Runtime和MVVM Light之间的主要区别(我能想到的)是VisualStateAwarePages、ViewModelLocator(自动与每个视图的属性)、BindableBase用于INotifyPropertyChanged以及一切有关应用程序生命周期管理的内容。两个框架都很好,但我不建议在它们之间切换一个完整的LOB应用程序,因为这样会导致太多工作(引入可能的错误)。


谢谢Bart。我有一个问题,Prism 6.0只是使用新的命名空间和支持UWP基础库的代码迁移吗?它是否还支持UWP的所有控件,如自适应触发器、相对面板等,与新的Prism 6.0一起使用? - Aakansha
1
控件(例如相对面板)和自适应触发器纯粹是UI问题。这通常不是您在MVVM框架中处理的内容,除非您希望通过绑定/命令/行为将数据返回到模型。 - Bart

3

Windows 10 UWP应用程序不太适合使用您提到的任何框架。它们丰富的导航功能和自适应布局意味着很难看出Prism如何适合您。至于MVVMLight,它提供的优势非常少,您可以避免使用它,以免日后出现令人讨厌的锁定问题(这种情况经常发生),相比之下,自己编写视图模型会更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接