自定义 MVVM 实现与。棱镜

Posted

技术标签:

【中文标题】自定义 MVVM 实现与。棱镜【英文标题】:Custom MVVM implementation Vs. PRISM 【发布时间】:2011-09-09 06:11:35 【问题描述】:

这个问题的灵感来自这个封闭的问题:

What does Prism actually offer the developer? And is it worth it?

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

我为什么要学习 PRISM(特别是 PRISM,而不是其他 MVVM 框架)? PRISM 相对于自定义 MVVM 实施的优势和 学习 PRISM 值得投资吗?

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

【问题讨论】:

akjoshi 打得很好,我们得到了一些很好的答案:D 这里有一个类似的问题:***.com/questions/6273357/what-is-prism-for-wpf/… 【参考方案1】:

PRISM 可能会让您感兴趣,因为它不仅仅是一个 MVVM 框架。是的,它的一部分实际上可以被认为是一个 MVVM 框架(NotificationObjectEventAggregator 和 Command 对象都是这样的例子),但它提供了更多。

它允许您创建多个松散组合“模块”的复合应用程序。它有一个非常灵活和可扩展的导航框架(区域导航),提供与 IoC 容器(尤其是 Unity 和 MEF)的集成以及大量其他功能。

除此之外,文档(包括电子书)非常好,并附带大量示例和快速入门。顺便说一句,我相信这是值得的投资,这不应该太多。

希望这会有所帮助:)

【讨论】:

【参考方案2】:

与为您执行共同任务的许多框架一样,您可以获得:

    经过更多眼球的测试:不仅仅是你自己。这(希望)包括单元测试,您在构建自己的框架时可能会或可能不会这样做。 对其他开发人员更具可读性:没有其他人对您的自定义 MVVM 框架有经验。但是,如果其他开发人员加入您的项目、加入您的团队或加入您的公司,他们可以直接跳入 Prism 代码。 更好的文档:同样,任何新加入的人都可能必须通过手动收集您的大脑和团队中任何其他用户的集体知识以及查看源代码来学习绳索。第三方框架有自己的文档,互联网上还有大量博客文章。 更好的社区:您可以在 *** 上提问“我如何使用 Prism 做 X?”你不能用你的自定义框架来问这个。 可能更有能力:需要为更多用户提供服务,而不仅仅是您/您的团队,因此将添加更多功能。如果您需要做一些您以前从未做过的与 MVVM 相关的事情,那么您自己的 MVVM 框架中可能没有内置对它的支持。但它很可能出现在 Prism 中。 更好的结构:假设您想做一些与 MVVM 相关的事情,但它不在 Prism 中。很有可能,这是有充分理由的!如果某些东西不在为在给定域中工作而设计的(相当成熟的)框架中,这表明您正在尝试做的是一种不自然或尴尬的解决问题的方式。使用你自己的框架,说“哦,我要添加那个功能”太容易了,然后 6 个月后你意识到你犯了一个巨大的错误,因为这个新功能使你的代码很难遵循,或者最终成为很多的向量错误或诸如此类的东西。 一个 CV 项目:我对雇用“实施并使用了自定义 MVVM 框架”的人有不同的感受。虽然这可能意味着他们很聪明,但也可能表明可怕的“非在这里建造综合症”。另一方面,将“Microsoft Prism MVVM 框架”放在一大堆技术中可能很好,但并不令人惊叹。两全其美将是一个更长的要点,类似于“深入理解 MVVM 模式,通过在切换到 MVVM Prism 之前首先实现一个用于学习目的的玩具 MVVM 框架来实现”。是的,这三者之间的区别不会影响或破坏你的简历,而且非本地综合症可能会在面试中出现,但值得牢记在心,尤其是在你申请的时候对于一个获得足够简历的地方,他们有能力扔掉任何让他们稍微不安的东西。

【讨论】:

好答案.. 但是对于 7:我认为您可以通过实现自己的 MVVM 框架来摆脱更少的代码和精神负担,该框架完全满足您的需求,仅此而已,而不是招致PRISM 成本.. 如果你看一下 MVVM-Light:它非常受欢迎,因为它捕获了 MVVM 模式的最简单的构建块,而你不必像 PRISM 那样理解一个具有所有魔力的怪物堆栈。简而言之:使用 Prism 可以摆脱 300 LOC 框架来做你想做的事,这根本不值得。 @Tigraine:+1 指出 Prism 可能不是 正确的 MVVM 框架,这确实是 OP 问题的一部分。希望其他人可以在他们的答案中更好地对比 MVVM 框架。我的目标更多是“自定义 MVVM 实现与......”部分,我认为这带来了一大堆问题,人们思考的频率远远低于他们应该考虑的频率。 @Tigraine:看到你的更新:使用 Prism 与 300 LoC 框架有什么“不值得”的,如果两者都做你想做的事?唯一的缺点似乎是怪物堆栈的所有魔力可能令人恐惧,但我觉得随着应用程序的增长,第 1--6 点肯定会适用于您的 300 LoC 框架。 我主要是在评论你的 7. 点,因为 Prism 确实是一个怪物。我有几个项目必须精简堆栈,以便新的团队成员和其他帮助的人可以得到如果他们没有先验技术知识,则可以更快地加快速度。而且由于整个堆栈(WPF 本身已经相当复杂)非常繁重,我喜欢有对当前项目结构有意义的逻辑构建块,而不是让我的员工谷歌“在 prism v4 中做 XYZ 的最佳方法”跨度> 但我当然一点也不反对 Prism .. 我通常倾向于使用 Caliburn.Micro .. 但有些项目可以轻松摆脱 2-3 个基类(如MVVM light),也许还有 1-2 个基于反射的东西来帮助你度过一天。如果你确实达到了一个成熟的框架确实有意义的地步,你应该能够重构......【参考方案3】:

Prism 是一个具有 MVVM 功能的应用程序组合框架,但(在我看来)不是一个功能齐全的 MVVM 框架。它提供了进行一些基本 MVVM 开发所需的最低要求。

有关应用程序组合框架和 MVVM 框架的细分,请参阅我之前对类似问题的回答。大多数应用程序会从这两个类别中选择一个:

Alternatives to Prism + MEF for modular MVVM apps

【讨论】:

【参考方案4】:

使用 prism 和 MEF,您可以构建高度可扩展和可维护的产品。网申请。每个模块在其单独的 dll 中都有自己的 UI。您的模块或扩展与 MainUI 之间的唯一连接将是您将在其中注入扩展的 UI 的区域。相信我,它具有高度的可扩展性和可维护性

【讨论】:

以上是关于自定义 MVVM 实现与。棱镜的主要内容,如果未能解决你的问题,请参考以下文章

WPF自定义控件与样式(14)-轻量MVVM模式实践

Kendo MVVM 数据绑定与自定义 Kendo 小部件

带有自定义过滤器的 Kendo MVVM Grid

kendo mvvm:如何定义自定义 css 绑定

C# mvvmlight model数据非自己定义可以绑定吗

Mvvm 支持自定义 kendo ui 小部件