【问题标题】:prism vs mvvm light for UWP application用于 UWP 应用程序的棱镜与 mvvm 灯
【发布时间】:2015-12-20 10:18:21
【问题描述】:

我们在 Windows 8.1 中有一个与 Win 10 兼容的工作项目。现在需要将此项目转换为 UWP。在早期的项目中,我们使用 PRISM 作为 MVVM 的框架。现在的问题是对于UWP应用,Prism的新版本还没有发布,我们正在考虑使用MVVMLight。

我对这两个框架都是新手,即 PRISM 和 MVVMLight。现在我的问题是将代码库从 PRISM 迁移到 MVVMLight 会有多困难。如果困难,应该等待PRISM更新版本发布。如果我们应该迁移到 MVVMLight,需要进行哪些重大更改。

根据我的观察,代码库与 PRISM 高度耦合,在整个代码中广泛使用 IResourceLoader、ISessionStateService 等接口。另外,我读到 PRISM 有一个学习曲线,而 MVVMLight 没有。因此,如果我们决定迁移到 MVVMLight,我是否必须先学习 PRISM 来理解代码库,然后再学习 MVVMLight 来移植代码库。如果我们决定等待本周某个时间发布更新版本的 PRISM,会不会有重大的代码更改?

两个框架如何支持单元测试。

既然分配给这项任务的时间不多,那么哪种方式最有效?

【问题讨论】:

  • “代码库与 PRISM 高度耦合” - 我认为这是您最大的问题。
  • 好的。因此,您能否介绍一下迁移到 MVVMLight 需要付出哪些努力,因为我们还没有批准使用 PRISM。我确实说过,这两个框架都是新手。
  • 你不需要一个花哨的框架来让 MVVM 为你工作,它只是让 一些 的事情更容易实现,比如 依赖注入 例如。圣杯是让您的代码自适应以改变、分离层并将实现公开为接口。除非您能找到分离依赖关系的方法,否则使用花哨的框架很可能会将您与该框架联系起来。这是一个相当庞大的话题,但我建议您阅读adaptive code
  • 虽然@MikeEason 说最好解耦尽可能多的代码是正确的,但您必须知道选择PRISM 与MVVM light 相比具有一些优势。因为它包含您不再需要自己编写的代码。一个示例是在导航时将 ViewModel 数据保存到本地存储。因此,如果您想继续使用另一个框架,则需要重写内置功能...
  • 值得注意的是Prism 6.0 for UWP applications has been released自从提出这个问题以来。

标签: c# mvvm prism mvvm-light uwp


【解决方案1】:

TL;DR:编译最新的 Prism 代码以期待新的 NuGet 包。

首先是关于 Prism 的简短介绍,以使每个人都步调一致。 Prism 是由 Microsoft Patterns & Practices 创建的 MVVM 指导/框架。他们发布了 WPF/Silverlight 的第 5 版。除此之外,他们还发布了适用于 Windows 8 的 Prism for Windows Runtime,后来更新到 Win8.1/WP8.1 RT。这是两个不同的代码库,第二个在区域等方面更轻量级,但为应用程序生命周期管理提供了非常有用的支持。认为它们相同是一种常见的误解。

3 月,Prism 的所有权作为一个开源项目转让给社区,可通过GitHub 获取。他们决定继续前进,将通用代码合并到 PCL 核心程序集中并添加对 Xamarin Forms 的支持。

截至今天,还没有针对 UWP 的 Prism 6 的 RTM 版本。代码库即将与only a few minor issues open 一起发布,但没有什么大的阻碍大多数用户已经使用这些位。此时我会告诉您克隆 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(每个视图的自动 vs 属性)、BindableBase for INotifyPropertyChanged 以及有关应用程序生命周期的所有内容管理。这两个框架都很好,但我不建议在它们之间切换一个完整的 LOB 应用程序,因为它的工作量太大(引入了可能的错误)。

【讨论】:

  • 谢谢巴特。我有一个QQ,Prism 6.0 是不是只是迁移了新命名空间的代码并支持UWP 的基础库?它是否还支持 UWP 的所有控件,如自适应触发器、相关面板等与新的 prism 6.0?
  • 控件(例如相对面板)和自适应触发器纯粹是 UI 问题。这是您通常不会在 MVVM 框架中处理的事情,除非您希望数据通过绑定/命令/行为返回到您的模型。
【解决方案2】:

Windows 10 UWP 应用远不适合您提到的任何框架。它们丰富的导航功能和自适应布局意味着很难看出 Prism 会如何为您服务。至于 MVVMLight,它在你滚动你自己的视图模型之上提供的东西很少,通过避免它,你可以避免一个讨厌的锁定的可能性,它会在以后咬你(它经常这样做)

【讨论】:

    猜你喜欢
    • 2013-12-27
    • 2011-02-15
    • 1970-01-01
    • 2011-09-09
    • 2017-03-26
    • 2019-06-12
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多