自定义MVVM实现与PRISM比较

28

这个问题的灵感来自于这个被关闭的问题:

Prism 究竟为开发人员提供了什么?是否值得使用?

我已经在企业应用程序中实现了自己的自定义 MVVM 实现。我想知道:

  • 为什么我应该学习 PRISM(具体来说是 PRISM,而不是其他 MVVM 框架)?
  • PRISM 相对于自定义 MVVM 实现的优势是什么?
  • 学习 PRISM 是否值得投资?

希望这个问题不是主观的,大家请不要争论 :)


3
干得好,akjoshi!我们得到了一些不错的答案:D - MalcomTucker
这是一个类似的问题:https://dev59.com/YG015IYBdhLWcg3w_Q4_#6273362 - rboarman
4个回答

26

像很多为你完成常见任务的框架一样,使用第三方框架你可以获得:

  1. 更多人的测试:不仅仅是你自己。这(希望如此)包括单元测试,而你在构建自己的框架时可能正在做或者没有做。
  2. 更易于其他开发人员阅读:没有其他人使用过你定制的MVVM框架。但如果另一个开发人员加入你的项目、团队或公司,他们可以直接开始使用Prism代码。
  3. 更好的文档:同样的道理,任何新人加入时都可能需要通过手动收集来自你的大脑和团队其他用户的集体知识以及查看源代码来学习技能。第三方框架有它们自己的文档,并且在互联网上有更多的博客文章。
  4. 更好的社区:你可以在StackOverflow上问关于“如何用Prism做X”的问题。但你无法对你自己的框架进行这种操作。
  5. 可能更有能力:由于需要服务于更多的用户而不仅仅是你/你的团队,因此可能会添加更多功能。如果你需要做一些你从未做过的与MVVM相关的事情,那么很有可能你自己的MVVM框架中不支持它。但是Prism中可能会有。
  6. 更好的结构:假设你想做一些与MVVM相关的事情,但Prism中没有这个功能。很可能,有一个很好的原因!如果某件事不在一个(相对成熟的)旨在解决特定领域问题的框架中,那么这表明你尝试解决问题的方式是不自然或笨拙的。使用自己的框架,很容易说“噢,我会添加那个功能的”,然后6个月后意识到犯了一个大错误,因为这个新功能使你的代码很难理解,或者最终成为许多错误的传播的源泉等等。
  • 简历的一项内容: 如果有人在简历中写有“实现并使用自定义MVVM框架”,我会有些矛盾的情感。虽然这可能意味着他们很聪明,但也可能表明他们拥有可怕的“非本地构建综合症”。另一方面,在众多技术列表中加入“Microsoft Prism MVVM Framework”可能很好,但也不令人惊叹。最好的方法是更长的项目符号,例如“通过首先实现一个玩具MVVM框架进行学习,然后切换到MVVM Prism来深入了解MVVM模式。”是的,这三者之间的区别不会对你的简历产生决定性影响,“非本地构建综合症”是希望在面试中提出的问题,但值得谨记,特别是如果您正在申请一个能够扔掉任何稍微让他们感到不安的简历的地方。

  • 9
    很好的回答。但是针对第7点,我认为实现自己的MVVM框架可以减少代码量和心理负担,而不必承担PRISM的成本。如果你看看MVVM-Light:它非常受欢迎,因为它捕捉了MVVM模式的最简单的构建块,而无需理解所有魔法般的堆栈(如PRISM)。简单地说:在你可以使用一个只有300行代码的框架来实现自己想要的功能时,使用PRISM就不值得了。 - Tigraine
    @Tigraine:点赞,指出Prism可能不是正确的 MVVM框架,这确实是OP问题的一部分。希望其他人在他们的答案中能够更好地对比MVVM框架。我的回答更多地针对“自定义MVVM实现与...”部分,我认为这带来了一系列问题,人们往往没有像他们应该那样经常考虑。 - Domenic
    @Tigraine:看到你的更新:如果两者都能做到你想要的,使用Prism与一个300行代码的框架相比,“不值得”的是什么?唯一的缺点似乎是可能会有一个由所有魔法组成的怪物堆栈的可怕性,但我觉得1-6点肯定会在你的应用程序增长时适用于你的300行代码框架。 - Domenic
    3
    我主要是在评论你的第7点,因为Prism确实很庞大。我曾经有几个项目需要削减技术栈,以便那些没有先前技术知识的新团队成员和其他协助者可以更快地上手。由于整个技术栈(WPF本身已经相当复杂)非常庞大,我喜欢有一些逻辑上的构建块,这些构建块对于当前项目结构是有意义的,而不是让我的人们在谷歌上搜索“在prism v4中做XYZ的最佳方法”。 - Tigraine
    4
    当然,我并不完全反对Prism。通常我倾向于使用Caliburn.Micro。但是有些项目可以轻松地只使用2-3个基础类(例如在MVVM Light中),也许只需要1-2个基于反射的东西就能应付日常开发。如果你达到了需要一个完整框架的地步,那么你应该能够进行重构。 - Tigraine
    +1,因为从未见过如此惊人的答案,甚至没有提到一个技术点:-)。所有的确都是真的。 - NileshChauhan

    9
    PRISM对你来说可能很有趣,因为它不仅是一个MVVM框架。实际上,它的一部分可以被认为是MVVM框架(例如NotificationObject、EventAggregator和Command对象),但它提供了更多功能。
    它允许您创建由多个松散耦合的“模块”组成的复合应用程序。它具有非常灵活和可扩展的导航框架(区域导航),提供与IoC容器(特别是Unity和MEF)的集成以及大量其他功能。
    除此之外,文档(包括电子书)相当不错,并且提供了大量示例和快速入门指南。我相信这值得投资,顺便说一句,投资并不多。
    希望这有所帮助 :)

    3

    Prism是一个具有MVVM特性的应用程序组合框架,但在我看来不是一个功能完备的MVVM框架。它提供了一些基本的MVVM开发所需的最低限度。

    关于应用程序组合框架和MVVM框架的详细信息,请参见我之前回答类似问题的答案。大多数应用程序都会从这两个类别中选择一个:

    可用于模块化MVVM应用程序的Prism + MEF替代方案


    1
    使用Prism和MEF,您可以构建高度可扩展和可维护的.Net应用程序。每个模块都有自己独立的UI在其自己的单独dll中。您的模块或扩展与MainUI之间唯一的连接将是您将扩展的UI注入的区域。相信我,这非常可扩展和可维护。

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